Data

Testing the Theory

Data: A Census of Public Comments

To examine the relationship between public pressure campaigns and lobbying success, I use an original dataset (introduced in Section ??) that combines several data sources on U.S. federal agency rulemaking.

The core data for this analysis are the texts of draft and final rules and public comments on these proposed rules published from 2005 to 2020. This includes all proposed rules from 161 agencies that were open for comment on regulations.gov between 2005 and 2020, received at least one comment from an organization, and saw a final agency action between 2005 and 2020. These 44,774 rulemaking dockets received a total of 58,380,146 comments.

I collected draft and final rule texts from federalregister.gov and comments submitted as digital files or by mail from regulations.gov. I also retrieve comments submitted directly on regulations.gov and metadata on rules and comments (such as the dates that the proposed rule was open for comment and whether the agency identified the organization submitting the comment) from the regulations.gov Application Programming Interface (API). I add additional metadata on rules (such as whether the rule was considered “significant”) from the Unified Agenda published by the Office of Information and Regulatory Affairs (reginfo.gov).

Where a new presidential administration used the same docket number to solicit comments on a proposed rule that a previous administration used, I count these as separate rulemaking dockets. I do so because the second policy usually reverses or moves policy in the opposite direction of the previous administration. The same organizations often comment on both policies but with opposite positions. Support becomes opposition and vice versa.

Clustering with text reuse

My theoretical approach requires that I attribute form letter comments to the organizations, campaigns, and broader coalitions that mobilized them. To do so, I identify comments that share text. I find that a 10-word phrase repeated across more than a few comments is always either text copied from the proposed policy or a form letter provided by a campaign. Thus, for each comment text, I first remove all 10-word phrases that appear in the proposed rule (including the preamble and call for comments). Then, I identify all comments that share ten-word phrases with 99 or more other comments. Finally, I collapse these form letter comments to one representative document for hand-coding.

I attempt to identify the organization(s) that submitted or mobilized each comment by extracting all organization names from the comment text. For comments that do not reference an organization, an internet search using portions of the comment’s text often identified the organization that provided the form letter text. I then identify lobbying coalitions both by hand and by textual similarity. Co-signed comments are always assigned to the same coalition. Likewise, form-letter comments are always assigned to the same coalition.

Through the iterative combination of automated search methods and hand-coding described in Section ??, I attribute each comment to the organization behind it (its author if submitted by the organization or the mobilizing organization for form letters). I also identify comments submitted by elected officials, with special attention to members of the U.S. Congress.

Because my hypotheses are about the influence of organizations and coalitions, I collapse these data to one observation per organization or coalition per proposed rule for analysis. I then identify the main substantive comment submitted by each organization’s staff or lawyers, which are usually much longer than supporting comments like form letters.

Hand-coded sample

To estimate the influence of public comments on policy, I use hand-coded comments on a random sample of rulemaking dockets. For each rule in the sample, almost all comments are hand-coded for their level of lobbying success. Hand-coding includes recording the type of organization, the lobbying coalition to which each comment belongs, the type of coalition (primarily public or private interests), their policy demands, and the extent to which the change between the draft and final rule aligned with their demands. This level of alignment between policy demands and policy outcomes is my measure of lobbying success. It does not identify a causal relationship (true policy influence), but it is the standard approach for assessing lobbying success with these kinds of observational data (see Yackee and Yackee 2006). For a more detailed description of the coding process, the codebook is available in Appendix ??.

I first selected a random sample of 69 proposed rules with both a mass-comment campaign and a final rule. I then selected all comments that were likely to be from organizations.1 The hand-coding process included identifying the organization responsible for each comment submitted by an organization (e.g., a business, nonprofit, or government).

I then selected a sample of 43 proposed rules on which the same organizations commented without a mass comment campaign. While most studies of mass comment campaigns to date have focused on the Environmental Protection Agency, my combined sample rules come from 42 agencies. Additionally, my sampling approach includes rules with very small and very large numbers of comments that previous studies exclude.

I include all comments submitted as file attachments or emails, but only some comments typed in a text box. Sophisticated lobbying organizations almost always submit comments as file attachments. I include comments typed in a text box if they share text with other comments, indicating they are part of a pressure campaign. This includes nearly all comments on most rules. I exclude entirely unique textbox contents and comments shorter than ten words. Most textbox comments and nearly all extremely short comments are trivial (e.g., “This sucks”). While form letters are often short, they are very unlikely to be less than ten words. For comments sharing text, I code one sample document for all versions of the form letter.

My approach to measuring lobbying success starts with policy demands raised in comments. The dimensions of conflict on which I judge lobbying success are those issues identified by commenters. Unlike other studies, the issues I use to assess lobbying success do not come from first reading the policy or of any a priori concept of what each policy fight is about. Instead, I read the change between draft and final rule with an eye for alignment with commenters’ requests (including requests that specific parts of the draft policy do not change.)

Using commenter requests to identify the dimensions of the conflict has advantages and disadvantages. Compared to other potential measures of success, it is more likely to focus on things that commenters care about and miss policy issues that other, non-commenting segments of the public might care about.

Other approaches to identifying the commenter’s relationship with policy changes have different strengths and weaknesses. For example, one could measure success by the number of times a comment is mentioned in the agency’s response to comments. However, this measure may be affected by strategic responsiveness by agencies choosing to discuss some issues more than others. It also counts explicit rejections toward the measure of responsiveness. One could also measure success by focusing on a priori potential aspects of the policy. Balla et al. (2020) count five factors: (1) the number of regulated entities, (2) the number of activities or substances being regulated, (3) the level of pollution standards, (4) the compliance and effective deadlines of the regulation, and (5) the monitoring and reporting requirements. Each takes one value (increasing or decreasing), and each is weighted equally in the analysis. In contrast, by starting with comments, my method relies on commenters to define the dimensions of conflict and highlight the issues they care most about. In this sense, my approach focuses on “the first face of power”—issues that are already on the agenda of the broader policy system.

The hand-coded sample includes 8,661 hand-coded documents representing over 29 million comments (including both mass comments and the sophisticated comments they support).

Table 1: A Sample of Hand-coded Public Comments
Docket ID Coalition Comment type Organization Position Success
DOT-OST-2018-0068 AAAE Org Finnair Plc Supports Rule 2
FEMA-2016-0003 AASA Org Aasa. Aesa Opposes Rule 2
FEMA-2016-0003 AASA Org Sam Walton Opposes Rule 2
NPS-2018-0007 ACLU Elected Grace Meng Opposes Rule 2
NPS-2018-0007 ACLU Org Justice First Opposes Rule 1
PHMSA-2012-0082 AFL-CIO Elected Peter Defazio Supports Rule -1
PHMSA-2012-0082 AFL-CIO Elected Gordon Johnson Supports Rule 1
ED-2016-OESE-0032 AFT Org Aft-New Mexico Opposes Rule 1
WHD-2019-0001 ANCOR Org Easterseals Supports Rule -2
WHD-2019-0001 ANCOR Org Leadingage Supports Rule -2
USCIS-2006-0044 ARTS Mass Alia Agency Opposes Rule -2
USCIS-2006-0044 ARTS Mass Alabama Ballet Opposes Rule -2
USCG-2010-0990 BOATU.S. Org Boatu.s. Opposes Rule -1
CFPB-2019-0006 CFSA Elected Nolan Mettetal Supports Rule 2
CFPB-2019-0006 CFSA Elected Mike Osburn Supports Rule 2
IRS-2019-0039 CLC Elected Steve Bullock Opposes Rule -2
IRS-2019-0039 CLC Org Issue One Opposes Rule 2
USCBP-2007-0064 EAA Org Sas Institute Supports Rule 1
FWS-R9-ES-2008-0093 EARTHJUSTICE Individual Socalxj Opposes Rule -2
FWS-R9-ES-2008-0093 EARTHJUSTICE Org Niabi Zoo Opposes Rule -2
WHD-2019-0001 EPI Org Afl-Cio Opposes Rule -1
WHD-2019-0001 EPI Org Network Lobby Opposes Rule -1
CFPB-2016-0025 EQUIFAX Org Equifax Supports Rule 1
CFPB-2016-0025 EQUIFAX Org Equifax Supports Rule -2
FWS-HQ-ES-2018-0097 FARM BUREAU Org Farm Bureau Supports Rule 2
DEA-2018-0005 HSCA Org Kratom United Opposes Rule -2
DEA-2018-0005 HSCA Org Vizient Opposes Rule -1
DOT-OST-2018-0068 IAADP Org Autism Speaks Supports Rule -1
OSHA-H005C-2006-0870 KIMBERLY-CLARK Org Kimberly-Clark Supports Rule 2
CEQ-2019-0003 LIUNA Mass Liuna Supports Rule -2
OCC-2020-0026 MLA Org Webbank Supports Rule 2
OCC-2020-0026 MLA Org Finwise Bank Supports Rule 2
CFPB-2019-0022 NAACP Mass Akpirg Opposes Rule 2
CFPB-2019-0022 NAACP Org Pro Seniors Opposes Rule 2
CFPB-2019-0006 NACA Elected Jesse Arreguin Opposes Rule -2
CFPB-2019-0006 NACA Elected Jamie Raskin Opposes Rule -2
CFPB-2019-0006 NAFCU Org Nafcu Supports Rule 2
CFPB-2019-0006 NAFCU Org Cuna Supports Rule 1
ICEB-2015-0002 NAFSA Mass Uaw Local 4121 Supports Rule 1
ICEB-2015-0002 NAFSA Org Ibm Supports Rule 2
CFPB-2019-0006 NCUA Org Finastra Supports Rule -1
CFPB-2016-0025 NCUA Org Nfib Opposes Rule -1
FEMA-2016-0003 NEMA Org State Of Maine Supports Rule 2
FEMA-2016-0003 NEMA Org City Of Norman Supports Rule 2
OSHA-H005C-2006-0870 NEWPORT NEWS Org Afl-Cio Supports Rule 1
OSHA-H005C-2006-0870 NEWPORT NEWS Org Public Citizen Supports Rule 1
FWS-HQ-NWRS-2012-0086 NRDC Org Sierra Club Supports Rule -2
FEMA-2016-0003 NRDC Org Smartersafe Supports Rule -2
NOAA-NMFS-2011-0117 OCEANA Mass Oceana Supports Rule -2
NOAA-NMFS-2011-0117 OCEANA Org Oceana Supports Rule -2
TREAS-DO-2007-0015 OTHER BANKS Org M&T Bank Opposes Rule 1
TREAS-DO-2007-0015 OTHER BANKS Org Eccho Opposes Rule 2
BSEE-2013-0011 PEW Individual Oasis Earth Supports Rule 2
BSEE-2013-0011 PEW Mass Pew Supports Rule 2
WHD-2019-0001 PPWO Org Argentum Supports Rule -2
WHD-2019-0001 PPWO Org Corps Network Supports Rule -2
ED-2016-OESE-0032 PUBLIC SCHOOLS NA Levelland Isd Supports Rule 1
BSEE-2013-0011 SHELL Elected Lisa Murkowski Opposes Rule -2
BSEE-2013-0011 SHELL Elected Shelley Hughes Opposes Rule 1
WHD-2019-0003 SHRM Org Fedex Supports Rule 2
WHD-2019-0003 SHRM Org Seyfarth Shaw Supports Rule 1
PHMSA-2012-0082 SIERRA CLUB Org Scenic Hudson Supports Rule -1
PHMSA-2012-0082 SIERRA CLUB Individual Sierra Club Supports Rule -2
USCIS-2006-0044 TRUE Org Centro Romero Opposes Rule -1
USCIS-2006-0044 TRUE Org World Relief Supports Rule 0
FEMA-2016-0003 USRC Org Air Worldwide Supports Rule -2
ICEB-2015-0002 VERIZON Org Verizon Supports Rule 1
WHD-2019-0001 WFCA Org Kullman Law Supports Rule 1
WHD-2019-0001 WFCA Org Bloomin Brands Supports Rule 1

Table 1 shows a sample of hand-coded public comments. Docket ID is the identifier for each rulemaking. The Organization, Comment Type, and Coalition columns show how coders record the name and type of each organization or elected official, as well as the broader coalition to which they belong. The name assigned to each coalition is usually the name of one of the lead organizations.

The Position column in Table 1 is a collapsed version of the spatial position-coding described in Section ?? and Appendix ??. To create a binary measure of support and opposition, I collapse the coding of each comment’s spatial position into a dichotomous indicator of whether they ultimately support or oppose the rule. Finally, Lobbying Success—whether each comment got what it asked for in the change between a draft and final rule—is coded on a five-point scale from 2 to -2. “2” indicates that most of the commenter’s requests were met. If the rule moved decidedly in the opposite direction as they would have liked it to move, this is coded as a “-2” (the opposite of total success). To measure these variables at the coalition level, I use the coding assigned to the lead organization or the average across coalition members. Because “lead” organizations are identified based on their leadership role in the coalition and the extent to which they represent the coalition’s policy demands, the lead organization’s coding is nearly the same as the average across coalition members in all cases.

Table 2: Organizations by Number of Rules on Which They Commented
Organization Rules Lobbied On
Chamber Of Commerce 10
Natural Resources Defense Council 10
Oceana 10
Earthjustice 9
Sierra Club 9
National Audubon Society 8
American Petroleum Institute 7
Center For Biological Diversity 7
National Wildlife Federation 7
Pew Charitable Trusts 7
Edison Electric Institute 6
National Association Of Home Builders 6
National Mining Association 6
Port Gamble S’klallam Tribe 6
Public Citizen 6
Afl-Cio 5
American Bankers Association 5
Associated Builders And Contractors 5
Endangered Species Coalition 5
Environmental Defense Fund 5
Farm Bureau 5
International Association Of Drilling Contractors 5
International Bancshares Corporation 5
Materion Brush Inc.  5
Naacp 5
National Association Of Manufacturers 5
National Employment Law Project 5
Nature Conservancy 5
Nez Perce Tribal Executive Committee 5
North Slope Borough 5
Ocean Conservancy 5
Quinault Indian Nation 5
Safari Club International 5
State Of Alaska 5
American Bird Conservancy 4
Associated General Contractors Of America 4
Association Of Oregon Counties 4
Better Markets 4
Blue Water Fishermen’s Association 4
Center For Regulatory Effectiveness 4
Columbia River Inter-Tribal Fish Commission 4
Confederated Tribes Of Warm Springs 4
Conference Of State Bank Supervisors 4
County Of Siskiyou 4
Defenders Of Wildlife 4
Florida Fish And Wildlife Conservation Commission 4
Independent Community Bankers Of America 4
Institute For Policy Integrity 4
Kentucky Equal Justice Center 4
Maryland Consumer Rights Coalition 4
National Association Of Conservation Districts 4
National Congress Of American Indians 4
National Parks Conservation Association 4
National Wild Turkey Federation 4
Northeast Seafood Coalition 4
Ocean Conservation Research 4
Offshore Operators Committee 4
Portland Cement Association 4
Snoqualmie Indian Tribe 4
Southern Ute Indian Tribe 4
Summit Lake Paiute Tribe 4
U.s. Chamber Of Commerce 4
Union Of Concerned Scientists 4
Wilderness Society 4
Aarp 3
Aca International 3
Aircraft Owners And Pilots Association 3
Alaska Oil And Gas Association 3
American Association Of State Highway And Transportation Officials 3
American Exploration & Mining Association 3
American Road & Transportation Builders Association 3
American Staffing Association 3
Americans For Tax Reform 3
Association To Preserve Cape Cod 3
Baker County 3
Catholic Charities Usa 3
Chesapeake Bay Foundation 3
City Of Portland 3
Coalition To Protect America’s National Parks 3
Confederated Tribes Of Grand Ronde 3
Conocophillips 3
Consumer Bankers Association 3
Consumer Reports 3
Consumers’ Research 3
Credit Union National Association 3
Domestic Energy Producers Alliance 3
Duchesne County 3
Economic Progress Institute 3
Elko County 3
Empire Justice Center 3
Energy And Wildlife Action Coalition 3
Family Farm Alliance 3
Florida Wildlife Federation 3
Freedomworks Foundation 3
Friends Of The Clearwater 3
George Washington University Regulatory Studies Center 3
Georgia Watch 3
Harney County Court 3
Hr Policy Association 3
International Fund For Animal Welfare 3

Table 2 shows the organizations that commented on the most rules in this sample: 435 organizations lobbied on more than one rule in the hand-coded data, some on as many as 10 rulemaking dockets. Recall that this sample of rules is weighted toward rulemaking dockets that received more comments. Thus, the organizations lobbying on the most rules are not the same as those in the overall population. For example, recall from Table 1 that the American Petroleum Institute lobbied on nearly 400 rules, whereas the Pew Charitable Trusts lobbied on 120. Pew, however, used a public pressure campaign 5 percent of the time it lobbied, whereas the American Petroleum Institute used a public pressure campaign 0.3 percent of the time it lobbied. Thus, groups like Pew that more often use pressure campaigns are more likely to be lobbying on rules in this sample. While this sampling approach was necessary (a random sample of all rules would yield almost none with a pressure campaign), the statistical results should be interpreted as disproportionately reflecting variation in lobbying success in high-salience and contentious rulemakings.

Table 3 shows the number of hand-coded rules, documents, the coalitions and organizations to which those documents belong, and the total number of comments they represent for a sample of agencies. As expected with a random sample, the agencies with the most rules in this sample are also those with the most final rules posted to regulations.gov (as shown in Figure ??). The Environmental Protection Agency (EPA), Fish and Wildlife Service (FWS), and National Oceanic and Atmospheric Agency (NOAA), Department of Transportation (DOT), and Internal Revenue Service (IRS) are all in the top ten agencies by the number of rulemaking dockets on regulations.gov. The Bureau of Safety and Environmental Enforcement, Consumer Financial Protection Bureau (CFPB), and Wage and Hour Division (WHD) of the Department of Labor are all above average and have a disproportionate number of rules with a large number of comments, making these agencies more likely to be selected into the weighted sample. Table 3 also illustrates how my method of collapsing documents with repeated text to one representative document allows me to reduce the number of documents requiring hand-coding by several orders of magnitude (compare the “Documents” and “Comments” columns).

Table 3: Hand-coded Data By Agency
Agency Rules Documents Coalitions Organizations Comments
EPA 21 1,711 41 500 18,288,495
NOAA 8 363 28 190 578,545
FWS 7 1,013 24 564 5,050,397
IRS 6 57 8 49 77,479
BSEE 4 259 13 205 245,370
CFPB 3 1,944 19 949 1,109,808
USCIS 3 89 10 64 98
DOT 2 145 8 109 145
OCC 2 120 4 97 265
OFCCP 2 191 5 32 13,616
WHD 2 265 8 214 101,556
BLM 1 178 3 32 1,342,966
CEQ 1 506 5 444 425,432
DEA 1 16 3 16 16
DOI 1 47 3 38 54,002
EBSA 1 70 2 68 721,880
ED 1 141 16 135 141
FEMA 1 380 9 349 3,139
ICEB 1 303 4 65 303
MSHA 1 52 3 43 52
NPS 1 100 3 68 69,698
OSHA 1 163 4 70 4,102
PHMSA 1 401 4 363 335,841
TREAS 1 60 8 52 60
USCBP 1 37 2 30 37
USCG 1 12 2 10 12
VA 1 33 2 12 44,870

Figure 1 shows hand-coded support and opposition to proposed rules by different types of commenters and presidential administration. Support and opposition coding come from the spatial position regarding the draft and final rule, as shown in Figure ??. Comments from a corporation (“Corp.”) were overwhelmingly opposed to Obama-administration policies and more supportive of Trump-administration policies. Elected officials more often write in opposition than in support of a proposed rule across administrations. In contrast, individuals, organizations, and the mass comments these organizations mobilized overwhelmingly supported Obama-administration policies and opposed Bush- and Trump-administration. Mass and individual comments are especially polarized. This reflects the partisan asymmetry in mobilizing organizations; the individuals (unique comments) and mass comments (form letters) mobilized by progressive public interest groups’ campaigns overwhelmingly supported Obama-era policies and opposed Trump-era policies.

Hand-coded Comments By Type and Position on Proposed Rule

Figure 1: Hand-coded Comments By Type and Position on Proposed Rule

Most of these comments belong to lobbying coalitions and are thus not independent observations. When Friends of the Earth and the Sierra Club lobby together on a rule, the success of each depends on the other. Thus, I group comments into coalitions. The hand-coded sample includes 353 “coalitions,” 162 of which are single-organization “coalitions” (not coalitions), leaving 191 true coalitions of multiple organizations lobbying together.

Lobbying coalitions range in size from 2 to 217 organizations. Table 4 shows a sample of coded data, summarized at the coalition level. Even though the same organization may lead coalitions in multiple rulemakings, each rule’s lobbying coalitions are different, so I consider them separate observations. For example, the American Civil Liberties Union (ACLU) led a coalition in 2014 with a small number of organizations and a medium-size pressure campaign in support of a rule requiring additional Equal Employment Opportunity reporting from the Department of Labor’s Office of Federal Contract Compliance Programs (OFCCP). The ACLU also led a very different coalition in 2020 with a large number of organizations and a very small public pressure campaign against a rule rolling back regulations on banks published by the Office of the Comptroller of the Currency (OCC). Figure 4 shows that this sample is fairly balanced between coalitions that succeed and fail to get the changes they seek in the final rule.

Table 4: A Sample of Hand-coded Data Summarized by Coalition
Docket ID Coalition Position Size Businesses Type Mass
OCC-2020-0026 ACLU Opposes Rule 75 2 Public 168
OFCCP-2014-0004 ACLU Supports Rule 11 0 Public 7,141
ICEB-2015-0002 AFL-CIO Supports Rule 5 2 Public 0
USCIS-2010-0017 AFL-CIO Opposes Rule 2 0 Public 0
TREAS-DO-2007-0015 AHC Supports Rule 1 0 Private 0
DEA-2018-0005 AMA Supports Rule 3 3 Public 0
CEQ-2019-0003 AMWA Opposes Rule 1 0 Public 0
USCIS-2006-0044 ARTS Opposes Rule 12 0 Public 0
CFPB-2016-0025 CBC Supports Rule 1 0 Public 0
CEQ-2019-0003 EOMA Supports Rule 1 1 Private 0
WHD-2019-0001 EPI Opposes Rule 55 5 Public 56,949
WHD-2019-0003 EPI Opposes Rule 40 1 Public 44,352
CEQ-2019-0003 EPIC Supports Rule 1 0 Public 0
DEA-2018-0005 HSCA Opposes Rule 10 3 Public 0
DOT-OST-2018-0068 IAADP Supports Rule 10 1 Public 0
ED-2016-OESE-0032 MCEC NA 1 0 Public 0
OCC-2020-0026 MLA Supports Rule 13 12 Private 0
USCIS-2010-0017 NCAPA Supports Rule 14 5 Public 0
WHD-2019-0001 NCPA Supports Rule 16 9 Private 0
FEMA-2016-0003 NCSL Opposes Rule 2 0 Public 0
CFPB-2019-0006 NCUA Supports Rule 5 3 Private 0
CEQ-2019-0003 NFIB Supports Rule 1 1 Private 0
FWS-R9-ES-2008-0093 NMBA Supports Rule 2 2 Public 0
FWS-HQ-NWRS-2012-0086 NRDC Supports Rule 14 0 Public 119,129
USCIS-2006-0044 NYCLA Supports Rule 2 0 Public 0
NOAA-NMFS-2011-0117 OCEANA Supports Rule 5 0 Public 12,882
BSEE-2012-0005 PEW Supports Rule 4 0 Public 1,526
NOAA-NMFS-2008-0096 PEW Supports Rule 20 2 Public 152,240
NOAA-NMFS-2012-0059 PEW Opposes Rule 31 3 Public 102,845
NOAA-NMFS-2013-0050 PEW Opposes Rule 8 1 Public 75,238
DEA-2018-0005 PHRMA Supports Rule 3 2 Public 0
BSEE-2013-0011 SHELL Opposes Rule 90 78 Private 87,690
OCC-2011-0014 SIFMA Supports Rule 1 1 Private 0
FEMA-2016-0003 SSIT Opposes Rule 1 0 Public 0
IRS-2016-0015 SWISS RE Supports Rule 1 1 Private 0
CFPB-2019-0006 TRUE Opposes Rule 1 0 Public 0
USCIS-2006-0044 TRUE Opposes Rule 11 4 Public 0
USCIS-2006-0044 UC Supports Rule 2 0 Public 0
TREAS-DO-2007-0015 UC GROUP Opposes Rule 1 1 Private 0
ICEB-2015-0002 VERIZON Supports Rule 3 1 Public 0
WHD-2019-0001 WFCA Supports Rule 54 38 Private 0
CFPB-2019-0022 WSECU Supports Rule 1 0 Public 0
TREAS-DO-2007-0015 XPRESSBET Opposes Rule 1 1 Private 0

Table 5 shows the number of coalitions coded as “public interest” and “private interest” by whether the majority of organizations in the coalition are for-profit businesses and trade associations or non-businesses (governments and nonprofits): 32 perecent are majority business coalitions. 60 percent are public-interest coalitions. As Table 5 shows, the hand-coded “public interest vs. private interest” distinction is highly correlated with the share of businesses in the coalition but not perfectly. These two measures diverge in cases where public interest coalitions mobilize a large number of business allies or where private interest coalitions mobilize a large number of non-business allies. Thus, while the share of businesses and trade associations is more objective, the public-private distinction is likely a better measure of coalition type. I estimate alternative models in Section ?? with each measure.

Table 5: Types of Lobbying Coalitions in the Hand-coded Sample
Coalition Type Business led Non-Business led Mass Comments No Mass Comments
Private 100 26 43 92
Public 12 155 82 130

Several coalitions may lobby on the same rule. One coalition’s lobbying success is correlated with another coalition’s lobbying success to the extent that they are asking for the same or contradicting policy changes. However, by grouping organizations into coalitions, I account for many of the causally-related policy requests (those organizations lobbying on an issue because another organization is lobbying on that issue).

Comments from Legislators

One mechanism by which campaigns may influence policy is by mobilizing members of Congress. Thus, I identify comments submitted by members of Congress and count the number of legislators in each lobbying coalition. Figure 2 shows the number of comments from members of Congress received during rulemaking by a sample of federal agencies. There is massive variation in the level of attention that members of Congress pay to different agencies and rules. The spikes in attention to each agency correspond with public pressure campaigns targeting rules from that agency. Oversight letters are frequently co-signed by multiple members from the Senate, House, or both chambers. Some of the rules on which members of Congress commented appear in the hand-coded sample. Table 6 shows the number of comments from the most common types of elected officials in the hand-coded data. Members of the U.S. House and Senate are the most common.

Number of Rulemaking Comments from Members of Congress per Year, 2005-2020 to the Bureau of Ocean Energy Management (BOEM), Consumer Financial Protection Bureau (CFPB), Department of Education (ED), Office of Energy Efficiency and Renewable Energy (EERE), Federal Aviation Administration (FAA), Fish and Wildlife Service (FWS),  Office of the Comptroller of the Currency (OCC), Occupational Safety and Health Administration (OSHA), Social Security Administration (SSA), U.S. Trade Representative (USTR)

Figure 2: Number of Rulemaking Comments from Members of Congress per Year, 2005-2020 to the Bureau of Ocean Energy Management (BOEM), Consumer Financial Protection Bureau (CFPB), Department of Education (ED), Office of Energy Efficiency and Renewable Energy (EERE), Federal Aviation Administration (FAA), Fish and Wildlife Service (FWS), Office of the Comptroller of the Currency (OCC), Occupational Safety and Health Administration (OSHA), Social Security Administration (SSA), U.S. Trade Representative (USTR)

Table 6: Comments from Elected Officials in the Hand-coded Data
Elected Official Type n
State Elected Official 55
Senate 51
House 45
Local Elected Official 14
Governor 8

The Dependent Variable: Lobbying Success

The dependent variable is the extent to which a lobbying coalition got the policy outcome it sought, which I measure in several ways.

First, on a sample of rules, I trained a team of research assistants to hand-code lobbying success for each organization or elected official, comparing the change between the draft and final rule to each organization’s demands on a five-point scale from “mostly as requested” to “significantly different/opposite from requested direction” as described in Section ??. Additionally, for each comment, coders identify the main overall policy demand, the top three specific demands, and the corresponding parts of the draft and final rule texts. This does not capture rule changes on which an organization did not comment.

Lobbying success on each specific demand was then coded for each organization and coalition. Both the overall score and average score across specific demands both fall on the interval from -2 (“significantly different”) to 2 (“mostly as requested”). A team of undergraduate research assistants then applied the codebook to all comments likely to be from organizations or elected officials on a random sample of rules. Several rules were double-coded by the whole team.

In the models below, coalition lobbying success is the mean of hand-coded lobbying success on a five-point scale, {-2, -1, 0, 1, 2}.

The average hand-coded success per organizational comment is 0 (N = 8,661). The average success for organizational comments with a mass comment campaign is -0.452 (N = 6,520).

The Main Predictor Variable

The number of supportive comments generated by a public pressure campaign (the main variable of interest) is a tally of all comments mobilized by each organization or coalition that ran a mass-comment campaign on a proposed rule. Because the marginal impact of additional comments likely diminishes, models typically include either the logged number of comments or a quadratic term to account for non-linear effects. If a coalition mobilizes more than 99 form-letter comments on a proposed rule, I code that coalition as having a mass comment campaign (campaign = 1). Where a coalition only submits technical comments from lawyers and does not mobilize public support, the binary measure, campaign, and the numeric measure, mass comments, are 0.

Figure 3 shows a scatterplot of the dependent variable (lobbying success) and main predictor (mass comments) for each coalition. Coalition lobbying success ranges from total success (2) to total loss (-2). The number of mass comments ranges from 0 to 3,012,281. The size of each point represents the size of each coalition (the number of organizations and elected officials). The color indicates whether the coalition is led by private or public interest groups. For example, one extremely large private coalition of payday lenders mobilized over a million comments during the Obama administration. This coalition was moderately successful at reducing the stringency of the regulation but did not stop it from going through.

The view of the data in Figure 3 does not show a clear relationship between public pressure and lobbying success. There were relatively more (and more successful) public interest campaigns in the Obama years. Likewise, there were more (and more successful) private interest campaigns in the Trump years. As predicted in ??, the largest campaigns are mostly public interest campaigns, and public interest campaigns are more frequent than private interest campaigns overall.

Lobbying Success by Number of Supportive Comments

Figure 3: Lobbying Success by Number of Supportive Comments

This approach differs previous studies of mass comment campaigns in at least two ways. First, my methods allow me to identify coalitions consisting of multiple organizations. Previous studies measure mass comment campaigns at the organization level. For example, Balla et al. (2020) analyzes “1,049 mass comment campaigns that occurred during 22 EPA rulemakings”—an average of nearly 50 “campaigns” per rule. By “campaign,” Balla et al. (2020) mean an organization’s campaign rather than a coalition’s campaign. Especially on EPA rules, there are rarely more than two or three coalitions engaging in public pressure campaigns–one of the environmental advocacy groups and their allies, another of regulated industry groups and their allies. Using organizations as the unit of analysis means that observations are far from independent. An analysis that counts one coalition’s campaign as 40 smaller “campaigns” with the same policy demands would count this one campaign as 40 observations.

In contrast, my methods allow me to measure levels of public pressure and lobbying success per organization and per coalition. Like previous studies, I identify the organizations responsible for mobilizing comments. Where other studies leverage the fact that the EPA gathers substantially similar comments, I am able to identify mass comment campaigns across dozens of federal agencies. Additionally, I further link common efforts by multiple organizations lobbying in a broader coalition. This allows for analysis with the lobbying coalition as the unit of analysis.

The second major difference between my approach and previous research is that I do not compare policymakers’ responses to sophisticated comments to policymakers’ responses to mass comments. Rather, I attribute mass comments to organizations and coalitions that also submit sophisticated technical comments. The set of comparisons one makes is critical to any study of responsiveness or policy influence. Researchers may reach different conclusions if they compare different things. Consider a study comparing how agencies respond to Sierra Club form letters to how they respond to the Sierra Club’s sophisticated comments. Now consider a study that compares responsiveness to the Sierra Club’s sophisticated comments between rules where they did and did not run a mass comment campaign. A study comparing the average influence of form-letter comments to the average influence of sophisticated comments is very different from a study that compares the influence of two sets of sophisticated comments with different levels of public pressure behind them. By measuring comments per coalition, both through hand-coding and text reuse, I capture different levels of public pressure than we would see if we were to look only at comments per organization.

Other predictor variables

Other predictors of lobbying success in the models below include the size of the lobbying coalition, whether the coalition is a business coalition, and whether the coalition is lobbying unopposed. The number and type(s) of organization(s) is an attribute of each coalition (e.g., a business coalition with N organizational members). Coalition size is a count of the number of organizations lobbying together on the rule, i.e., the number of distinct commenting organizations in each coalition. For organizations lobbying alone, coalition size is 1. Coalition is an indicator variable for whether the organization is lobbying in a coalition. It takes a value of 0 when coalition size is 1 and 1 if coalition size is greater than 1. A coalition is unopposed when no opposing organizations comment. This is derived from the hand-coded spatial position of each comment. If an organization supports the proposed rule and others oppose it, they have opposition. Likewise, if an organization opposes a proposed rule and others support it, they have opposition. However, if multiple coalitions support (or oppose) the rule for different reasons (e.g., one coalition would like one provision added while another coalition would like a different provision added), a rule may have multiple unopposed lobbying coalitions.

I code a coalition as a business coalition if the majority of commenting organizations are for-profit businesses and trade associations. Business is binomial. Alternative models in the Appendix use the number and share of businesses in a coalition instead.

Examples of hand-coded lobbying success

A rule with a public pressure campaign: the 2015 Waters of the United States Rule: In response to litigation over the scope of the Clean Water Act, the Environmental Protection Agency and Army Corp of Engineers proposed a rule based on a legal theory articulated by Justice Kennedy, which was more expansive than Justice Scalia’s theory. The Natural Resources Defense Council (NRDC) submitted a 69-page highly technical comment “on behalf of the Natural Resources Defense Council…, the Sierra Club, the Conservation Law Foundation, the League of Conservation Voters, Clean Water Action, and Environment America” supporting the proposed rule:

We strongly support EPA’s and the Corps’ efforts to clarify which waters are protected by the Clean Water Act. We urge the agencies to strengthen the proposal and move quickly to finalize it… ( EPA-HQ-OW-2011-0880-16674)

I coded this as support for the proposed rule. Specifically, NRDC would like the EPA to move policy further in the same direction. NRDC makes four substantive requests: one about retaining language in the proposed rule (“proposed protections for tributaries and adjacent waters…must be included in the final rule”) and three proposed changes (“we describe three key aspects of the rule that must be strengthened”).2 I also coded it as requesting speedy publication. These demands provide specific keywords and phrases for which to search in the draft and final rule text. By comparing the requested policy outcomes to the text of the final rule, I evaluate the extent to which NRDC got what it asked for.

A coalition of 15 environmental organizations mobilized over 944,000 comments. Over half (518,963) were mobilized by the four organizations mentioned in NRDC’s letter: 2421,641 by Environment America, 108,076 by NRDC, 101,496 by Clean Water Action, and 67,750 by the Sierra Club. Other coalition partners included EarthJustice (formerly a part of the Sierra Club, 99,973 comments) and Organizing for Action (formerly president Obama’s campaign organization, 69,369 comments). This is one of the larger campaigns in the dataset. This coalition made sophisticated recommendations and mobilized a million people in support of NRDC’s sophisticated lobbying.

The final rule moved in the direction requested by NRDC’s coalition, but to a lesser extent than requested—what I code as “some desired changes.” As NRDC et al. requested, the final rule retained the language protecting tributaries and adjacent waters and added some protections for “other waters” like prairie potholes and vernal pools. EPA did not alter the exemptions for ditches and waste treatment systems.

For this coalition, the dependent variable, Lobbying success is 1 on the scale from -2 to 2, coalition size is 15, business is 0, their position (supports rule) is 1, campaign is 1, and the number of mass comments is 943,931.

2009 Fine Particle National Ambient Air Quality Standards: In 2008, the EPA proposed a rule expanding air quality protections. Because measuring small particles of air pollution was once difficult, large particulates were allowed as a surrogate measure for fine particles under the EPA’s 1977 PM10 Surrogate Policy. EPA proposed eliminating this policy, requiring regulated entities and state regulators to measure and enforce limits on much finer particles of air pollution.

EPA received 163 comments on the rule, 129 from businesses, business associations such as the American Petroleum Institute and The Chamber of Commerce, and state regulators that opposed the rule. Most of these were short and cited their support for the 63-page comment from the PM Group, “an ad hoc group of industry trade associations” that opposed the regulation of fine particulate matter. Six state regulators, including Oregon’s, only requested delayed implication of the rule until they next revised their State Implementation Plans (SIPs) for Prevention of Significant Deterioration (PSD). EarthJustice supported the rule but opposed the idea that the cost of measuring fine particles should be a consideration. On behalf of the Sierra Club and the Clean Air Task Force, EarthJustice commented: “We support EPA’s proposal to get rid of the policy but reject the line of questioning as to the benefits and costs associated with ending a policy that is illegal.” The EarthJustice-led coalition also opposed delaying implementation: “EPA must immediately end any use of the Surrogate Policy—either by ‘grandfathered’ sources or sources in states with SIP‐approved PSD programs—and may not consider whether some flexibility or transition is warranted by policy considerations.”

The final rule did eliminate the Surrogate Policy but allowed states to delay implementation and enforcement until the next scheduled revision of their Implementation Plans. I code this as the EarthJustice coalition getting most of what it requested, but not a complete loss for the coalition lobbying on behalf of the regulated industry.

For the PM Group coalition, the dependent variable, coalition lobbying success is -1, coalition size is 129, business coalition is 1, pressure campaign is 0, and the number of mass comments is 0. For the State of Oregon’s coalition, the dependent variable, coalition lobbying success is 2, coalition size is 6, business coalition is 0, pressure campaign is 0, and the number of mass comments is 0. For the EarthJustice coalition, the dependent variable, coalition lobbying success is 1, coalition size is 3, business coalition is 0, pressure campaign is 0, and the number of mass comments is 0. These examples are broadly consistent with the overall data—lobbying success in these two examples is the same, despite the large difference in public pressure. This is not consistent with Hypotheses ?? or ?? that anticipated higher lobbying success with more public pressure.

Figures 4 and 5 show the distribution of values for coalition-level variables in the hand-coded data. Figure 4 shows a wide range of variation for coalition size and lobbying success, whereas the modal number of businesses is concentrated near 0. Most coalitions are between two and twenty members. About half have no business members, but a few have over 100. It is possible for the number of businesses to be larger than the coalition size where the same company sent in multiple comments. This occurs when franchised businesses mobilize local stores to send in letters. Because coalition size is the number of unique organizations, these are only counted once, but each is counted in the businesses variable.

Figure 5 shows that most coalitions in these data include no members of Congress, but some have as many as 27. The total number of mass comments is somewhat bimodal, reflecting the two random samples of rules from which these rules come. Most coalitions did not mobilize a pressure campaign and thus have no mass comments, but a few have over a million. The models below use either a binary indicator for mass comments, the logged value, or the number rescaled as hundreds of thousands of comments.

Hand-coded Data by CoalitionHand-coded Data by CoalitionHand-coded Data by Coalition

Figure 4: Hand-coded Data by Coalition

Number of Comments Linked to Hand-Coded CoalitionsNumber of Comments Linked to Hand-Coded Coalitions

Figure 5: Number of Comments Linked to Hand-Coded Coalitions

Limitations

The two main limitations of this design both bias estimates of public pressure campaign influence toward zero.

First, lobbying success may take forms other than changes in policy texts. Agencies may speed up or delay finalizing a rule, extend the comment period, or delay the date the rule goes into effect. Indeed, commenters often request speedy or delayed rule finalization, comment period extensions, or delayed effective dates. While I capture lobbying success concerning timing, my hand-coding approach prioritizes change in policy text, which is more difficult to achieve. Where commenters rand both substantive and procedural (e.g., extended comment period) requests, I coded success concerning the substantive demands.

Second, bureaucrats may anticipate public pressure campaigns when writing draft rules, muting the observed relationship between public pressure and rule change at the final rule stage of the policy process. This is a limitation of all studies of influence during rulemaking comment periods.

Methods

Methods

The most direct way to assess the hypothesis that mass engagement increases lobbying success is to assess the relationship between the number of comments mobilized by a coalition and its lobbying success. The dependent variable for most analyses is the organization or coalition’s lobbying success, hand-coded on the interval between 2 (total success; the policy changed as requested) to -2 (total loss; the policy changed in the opposite direction requested). However, public pressure campaigns may only be effective under certain conditions. Specifically, pressure campaigns may help some types of coalitions more than others. Thus, I assess both the main relationship between pressure campaigns and lobbying success and the interaction between campaigns and coalition type. I then assess evidence for or against different potential causal pathways of influence. The main indirect pathway by which campaigns may influence agency policymaking is through engaging members of Congress.

These data have a hierarchical structure. Comment-level observations are nested within an organization, within a coalition, within a rule, within an agency, and an administration. I use a combination of fixed and random effects to account for dependence among observations at higher levels of analysis. The main models use data rolled up to the coalition level. Coalitions range from 1 to over 200 organizations in size and may include anywhere from 1 to over a million comments. Finally, I use a difference-in-difference design to assess variation in success within organizations that lobby on multiple rules.

Modeling Coalition-level Lobbying Success

The Direct Relationship Between Public Pressure and Lobbying Success

The dependent variable, \(Y\), is the lobbying success of each coalition. To estimate the relationship between a coalition’s lobbying success and the scale of public pressure it mobilizes, I model the success of each coalition \(i\) lobbying a rule \(j\) published by an agency \(k\) under a president \(p\). Each coalition is unique to a rule; each rule is unique to an agency (I assigned joint rules to the lead agency only) and presidential administration. I thus use the simpler notation \(y_i\) rather than the equivalent, more specific notation \(y_{ijkp}\).

The main variable of interest is the total number of form-letter public comments that a lobbying coalition mobilized. The base model (Equation (1)) uses an indicator for whether coalition \(i\) used a public pressure campaign, i.e., mobilized mass comments (by definition, more than 99 mass comments). \(\beta_1\) estimates the difference in lobbying success when coalition \(i\) uses a pressure campaign compared to when it does not. Other models use either the logged number of comments or a quadratic term to account for the different marginal effects of additional public comments for smaller and larger campaigns.

\[\begin{equation} Y_{i} = \beta_1 \textbf{Pressure campaign}_{i} + \beta_{2:n} X_i + \gamma_j + \delta_p + \epsilon_{i} \tag{1} \end{equation}\]

The base models include agency and president fixed effects (\(\gamma_k + \delta_p\)) and control for other coalition-level factors that may affect a coalition’s lobbying success, \(X_i\). Controls include whether the coalition is lobbying unopposed, the coalition’s size (the number of distinct organizations and elected officials), and the type of coalition (e.g., whether it is a business coalition or a public-interest coalition). \(\beta_{2:n}\) are the effects of these other coalition-level factors on lobbying success. I estimate these relationships using OLS regression.

Congressional Support as a Mediator of Lobbying Success

To assess congressional support as a mediator in the influence of public pressure campaigns on rulemaking, I estimate the average conditional marginal effect (ACME) and the proportion of the total effect attributed to mediation through congressional support (comments or other communication from Members of Congress supporting the coalition’s position on the proposed rule). As developed by Imai et al. (2010), this involves first estimating a model of the potential mediator as a combination of the main predictor, public pressure, and covariates, \(X_i\).

The mediator model (Equation (2)) estimates the relationship between the scale of public pressure and the number of comments from members of Congress, who may receive political information (e.g., about the level of public attention or public opinion) from public pressure campaigns.

\[\begin{equation} \textbf{Congressional Support}_{i} = \beta_0 + \beta_1 \textbf{Pressure Campaign}_{i} + \beta_{2:n} X_{i} + \gamma_k + \delta_p + \epsilon_{i} \tag{2} \end{equation}\]

The outcome model (Equation (3)) is the same as Equation (1), except that it now includes the number of supportive comments from members of Congress as a predictor. \(y_i\) is the Lobbying success of coalition \(i\) on a rule published by agency \(k\) under president \(p\). Pressure Campaign\(_{i}\) is an indicator for whether the coalition organized a pressure campaign, Congressional Support\(_{i}\) is the number of members of Congress supporting the coalition, and \(X_{i}\) are other coalition-level predictors of lobbying success. \(\beta_{3:n}\) are the the effects of these other coalition-level covariates.

\[\begin{equation} Y_{i} = \beta_1 \textbf{Pressure campaign}_{i} + \beta_2 \textbf{Congressional Support}_{i} + \beta_{3:n} X_i + \gamma_j + \delta_p + \epsilon_{i} \tag{3} \end{equation}\]

The next section presents results from estimating the above models using the hand-coded data.

Difference in Differences in Organization-level Lobbying Success

While it would not be appropriate to compare the lobbying success of organizations within a rulemaking (because many organizations belong to the same coalition), we can compare the lobbying success within the same organization across rules. This limits the analysis to organizations that lobby on multiple policies. The key variation of interest is when organizations lobby with a public pressure campaign versus when they do not.

There is still a (lesser) problem with the i.i.d. assumption because two organizations lobbying in a coalition on one rule may mobilize each other to lobby in coalition on a different rule (in my data, lobbying coalitions are at the policy-level, since they differ from policy to policy).

At the organization level, the appropriate analysis is a difference-in-difference design. We know the success of each organization when it does and does not participate in a lobbying coalition that mobilizes public pressure (at least each organization that I can use for this analysis). The difference within an organization is now the key variation.

\[\begin{equation} Y_{ij} = \alpha_i + \beta_0 + \beta_1 \textbf{Pressure Campaign}_{ij} + \beta_{2-n} X_{ij} + \gamma_k + \delta_p + \epsilon_{ij} \tag{4} \end{equation}\]

Equation (4) is similar to the model of coalition-level success except that \(y_{ij}\) is now the lobbying success of organization \(i\) in coalition \(j\) and \(X_{ij}\) is now a vector of organization- and coalition-level controls. Additionally, Equation (4) adds \(\alpha_{i}\), a fixed effect for each organization. This fixed effect accounts for the organization’s characteristics that do not vary over time as it lobbies on multiple rules. This difference-in-difference design ensures that coefficient \(\boldsymbol{\beta}_1\) captures variation related to changes in levels of public pressure and other factors that vary within each organization, not other factors that may vary across organizations.

\({\beta}_{2:n}\) captures estimates for the effects of other factors that may affect an organization’s lobbying success, including coalition size, the difference in the success of organization \(i\) when they support proposed policy \(j\) rather than oppose it. \({President}_{j}\) is a dummy for whether policy \(j\) was proposed by President Trump or Bush rather than President Obama’s administration.

Assuming that organizations have parallel trends in their level of success given a level of support, \(\boldsymbol{\beta}\) represents the average effect of changing levels of public pressure on an organization’s lobbying success.


Results

Results: Lobbying Success

This section leverages a random sample of agency rules for which I have hand-coded nearly all public comments. The first subsection presents estimates of the direct relationship between public pressure and lobbying success (Table 7). The next subsection presents results of mediation analysis, assessing the support from members of Congress as a mediator for the success of public pressure campaigns (Tables 8). The third subsection presents estimates of factors affecting within-organization levels of lobbying success using a difference-in-difference design (Table 9).

Coalition-level Lobbying Success

Table 7 presents results estimating coalition-level lobbying success as a function of public pressure, coalition size, coalition type, whether the coalition supports the proposed rule, and whether there is an opposing coalition, as described in Equation (1).

Models 1 and 2 use a binary measure of public pressure—did the coalition sponsor a public pressure campaign or not? Models 2-6 use continuous measures of public pressure. Models 3 and 4 use the logged number of mass comments, reflecting the intuition that one additional comment matters more for smaller campaigns. Models 5 and 6 include both linear and quadratic terms for the number of comments to allow for a wider array of possible non-linear relationships.

I use two related measures of coalition type. Models 1, 3, and 5 use my classification of coalitions as primarily public or private interests. Private interest is the omitted category, so coefficients are estimates of the difference in lobbying success for public interest coalitions compared to private interest coalitions. Models 2, 4, and 6 use a related, more objective measure: whether most coalition members are businesses or trade associations.

All models include fixed effects for agency and president to allow for differing average levels of lobbying success at different agencies and political conditions. These models include coalitions of 1 (organizations lobbying alone), but excluding them yields similar results, except that coalition size has a much weaker correlation with lobbying success.

Table 7: OLS Models of Coalition-Level Lobbying Success
Model 1 Model 2 Model 3 Model 4 Model 5 Model 6
Dependent Variable Lobbying Success Lobbying Success Lobbying Success Lobbying Success Lobbying Success Lobbying Success
Pressure Campaign 0.293 -0.857*
(0.319) (0.368)
Public 0.281 0.196 0.011
(0.332) (0.320) (0.267)
Coalition 0.027 -0.166 -0.011 -0.240 0.057 -0.246
(0.552) (0.595) (0.564) (0.605) (0.596) (0.649)
Log(Coalition Size) 0.206+ 0.267* 0.238+ 0.306* 0.141 0.268+
(0.116) (0.127) (0.127) (0.118) (0.132) (0.133)
Supports Rule 1.235*** 1.220** 1.221** 1.201** 1.228** 1.187**
(0.317) (0.322) (0.324) (0.320) (0.332) (0.345)
Unopposed 0.525* 0.522 0.604** 0.526+ 0.730** 0.671*
(0.207) (0.324) (0.181) (0.279) (0.193) (0.285)
Pressure Campaign × Public -1.337**
(0.462)
Business Coalition -0.010 -0.016 0.072
(0.330) (0.322) (0.302)
Pressure Campaign × Business 0.857
(0.515)
Log(Mass Comments) -0.043 -0.118***
(0.030) (0.028)
Log(Mass Comments) × Public -0.068+
(0.038)
Log(Mass Comments) × Business 0.076
(0.059)
Mass Comments -0.540* -1.799*
(0.205) (0.794)
(Mass Comments)^2 0.056* 0.681
(0.024) (0.498)
Num.Obs. 252 211 252 211 252 211
R2 0.342 0.295 0.335 0.301 0.318 0.291
Log.Lik. -417.398 -357.471 -418.728 -356.466 -422.024 -358.067
Std. Errors Clustered (agency) Clustered (agency) Clustered (agency) Clustered (agency) Clustered (agency) Clustered (agency)
FE: agency X X X X X X
FE: president X X X X X X
+ p < 0.1, * p < 0.05, ** p < 0.01, *** p < 0.001

Table 7 shows that the main effect of public pressure campaigns, \(\beta_1\), in Model 1 is 0.29 (S.E. = 0.48) on the five-point scale of lobbying success. Because these models include interactions with coalition type, the main effect is the estimated effect for the omitted category. In Model 1, this is the effect of a pressure campaign for a private interest group coalition. For public interest groups, the estimate is \(\beta_1 + \beta_6\) = -1.04, reflecting large negative interaction between indicators for public interest coalitions and pressure campaigns (Pressure Campaign × Public). Estimates are inconsistent across specifications.

Models 3-6 use continuous measures of the scale of public pressure campaigns. Estimates are inconsistent across specifications, but Models 5 and 6 suggest that the relationship is initially negative and then positive for very large campaigns (the combined effect of the linear and quadratic terms is negative until approximately one million comments). One possible explanation for this result is that only very large campaigns create meaningful information about public demands. In sum, there is little evidence that pressure campaigns (either public or private) increase lobbying success, but there is strong evidence that public interest campaigns are much less successful than private interest campaigns.

The other strongest predictor of lobbying success across all models is whether the organization supports the rule. In Model 1, coalitions supporting the proposed rule change had an average success 1.23 points greater than those that opposed the rule (S.E. = 0.2) on the five-point lobbying success scale. This estimate is fairly consistent across specifications in Models 1-6. This correlation likely reflects a combination of several related dynamics. First, final rules are often published without change from the draft rule. Organizations that support the new proposed rule are thus likely to “succeed” when the status quo (that is, the status quo set in the proposed rule) prevails. Second, organizations that support a proposed rule are necessarily aligned with agency officials’ preferred policy direction. If agency officials change the final rule to further change policy in their preferred direction, such changes often align with organizations that supported the rule. Likewise, if commenters are aligned with agency officials, their suggestions may be more likely to be adopted, even if those suggestions do not exactly push policy further in the same direction. Finally, by selecting proposed rules that had a final rule rather than being withdrawn, this sample is missing some lobbying success by organizations that requested a proposed rule be withdrawn.

In line with previous research, coalition size (the number of distinct organizations in a coalition) is correlated with lobbying success Dwidar (2021). This is notable because this sample includes rules with much more public attention and many more public comments than those used in previous studies. There is at least some evidence that these findings hold in much more salient and contentious policy fights. Also, in line with previous research, there is evidence that coalitions are more successful when they lobby unopposed. This is notable because very few coalitions did not face opposition in this disproportionately contentious sample of agency rules. When they did, they were approximately 0.53 points more successful (estimates are fairly consistent across specifications in models 1-6).

The limited size of this sample means that we lack statistical power to have confidence that the estimates for many of the other variables differ from 0. Unlike previous studies on less contentious samples of rules (Yackee and Yackee 2006), I find no relationship between business-dominated coalitions (business coalition) and lobbying success.

As this sample consists disproportionately of draft rules that received an unusual number of comments, these results are largely based on the variation within high-salience rulemakings.

I now turn to a key variable omitted from the models in Table 7: the level of attention and support from an agency’s political principals—specifically, members of Congress, which may mediate the effect of public pressure campaigns.

Congressional Support as a Mediator of Lobbying Success

Hypothesis 1—that the overall level of public attention to a proposed rule moderates the level of attention from members of Congress—implies a correlation between the number of comments from members of Congress and all other comments on each rule. We should assess this correlation both across all rules and rules where at least one legislator commented, making it more plausible that legislators were aware of the rulemaking and thus faced the choice of whether to comment or not. Figure 6 shows both of these relationships. The dashed line shows the relationship between mass comments and comments from members of Congress for all rules. The solid line shows this relationship for rules where at least one legislator commented. The right-hand panel shows this same plot with both axes on a log scale, which allows us to better observe the relationship for rules with relatively fewer comments. There is a strong correlation between mass comments and legislator attention (Spearman’s rank correlation, \(\rho\) = 0.24, p-value = 0). However, for reasons discussed in ??, this should not be taken as strong evidence of a causal effect.

Correlation Between Mass Comments and Comments from Members of CongressCorrelation Between Mass Comments and Comments from Members of Congress

Figure 6: Correlation Between Mass Comments and Comments from Members of Congress

To assess congressional support as a potential mediator in the influence of public pressure campaigns on rulemaking, I estimate the average conditional marginal effect (ACME, conditional on the number of comments from Members of Congress) and average direct effect (ADE) of mass comments using mediation analysis. To do this, I estimate a model predicting the proposed mediator. Because the dependent variable (the number of supportive comments from members of Congress) is a count and the dispersion parameter is not significantly above 1, a Poisson model is most appropriate.

The first two models in Table 8 are similar to those in Table 7, but the dependent variable is now the mediator variable (the number of supportive members of Congress). The outcome model is the same as Model 1 in Table 7 but includes the proposed mediator, the number of supportive comments from members of Congress. (See Equation (2)).

By definition, only organizations lobbying in coalition with others have members of Congress in their coalition. Thus I exclude the “coalitions” of 1 organization and omit the indicator of whether the group is lobbying in the coalition from the model. I also subtract the number of members of Congress from the coalition size.

Table 8: Regression Models of Congressional Support and Lobbying Success for Mediation Analysis
Fire alarm/Beacon Mediator Model (Poisson) Warning Sign Mediator Model (Poisson) Outcome Model (OLS)
Dependent Variable Members of Congress in Coalition Members of Congress Opposing Coalition Lobbying Success
Pressure Campaign 0.763+ -0.300 0.233
(0.425) (0.270) (0.286)
Public 0.696* -0.507* -0.274
(0.315) (0.241) (0.267)
Log(Coalition Size) 0.097 0.039 0.118
(0.140) (0.061) (0.093)
Supports Rule -0.434** 0.633** 1.234**
(0.143) (0.242) (0.376)
Pressure Campaign × Public -0.440 0.388 -0.829*
(0.308) (0.395) (0.390)
Members of Congress -0.020
(0.028)
Num.Obs. 141 141 141
R2 0.468
R2 Adj. 0.323
R2 Within 0.309
R2 Pseudo 0.344 0.453
AIC 494.6 535.8 470.8
BIC 583.1 624.3 562.2
Log.Lik. -217.302 -237.923 -204.390
Std. Errors Clustered (agency) Clustered (agency) Clustered (agency)
FE: agency X X X
FE: president X X X
+ p < 0.1, * p < 0.05, ** p < 0.01, *** p < 0.001

The results shown in Table 7 do not offer much support for hypotheses 2—that pressure campaigns attract support from legislators—or 3—that they reduce legislator opposition. If 2 were correct, pressure campaigns should be correlated with the number of supportive letters from members of Congress (the DV in the first column). While the effects are in the expected direction, the coefficient on Pressure Campaign in the “Fire alarm”/“Beacon” Mediator model is not significantly different from 0 at the .05 level. If 3 were correct, pressure campaigns should be negatively correlated with the number of opposing comments from members of Congress (the DV in the second column). The coefficient on Pressure Campaign in the “Warning Sign” Mediator model is also not significantly different from 0.

There is some evidence for relationships other than those hypothesized. Public interest coalitions may be more likely to receive support and less likely to be opposed by members of Congress, all else equal. Public interest coalitions have 0.7 more supportive comments from members of Congress and have 0.51 fewer comments opposing them.

Because members of Congress are overall more likely to oppose proposed changes than organizations and pressure campaigns (see Figure 1), there is a negative relationship between supporting a proposed rule and the number of comments from members of Congress in one’s coalition. Likewise, there is a positive relationship between supporting a proposed rule and the number of members of Congress opposing one’s coalition.

The outcome model results (the third column in Table 7) are similar to the results of Model 1 in Table 7, despite dropping organizations lobbying alone. Again, the strongest predictor of lobbying success is supporting the direction of policy change. Adding congressional support to the model improves the model fit over Model 1 in Table 7 (comparing R-squared and log-likelihood). The number of supportive comments from members of Congress is associated with a -0.83 point difference in lobbying success (S.E. = 0.5).

While there is some evidence that public pressure campaigns affect the proposed mediator—support from members of Congress—there is little evidence for the main relationship of interest. Given this, the proposed mediation analysis does not offer much additional leverage on the hypotheses. The average effect of a public pressure campaign on lobbying success, conditional on letters from members of Congress (the ACME), is -0.07 on the 5-point scale, with a p-value of 0.144.

Difference in Differences in Organization-level Lobbying Success

I now turn from assessing variation across coalitions to variation within organizations as they lobby in multiple coalitions across policies and over time. Estimates in Models 1 of Table 9 show the results of estimating model (4). Models 2 presents results from a similar model with fixed effects for each rule rather than for each agency. Model 3 includes indicator variables for each president interacted with the main variables of interest (whether an organization lobbies with a coalition that mobilizes public pressure and whether an organization lobbies with a public or private interest coalition).

Table 9: Difference-in-Difference Model of Lobbying Success Within Organizations
Model 1 Model 2 Model 3
Dependent Variable Lobbying Success Lobbying Success Lobbying Success
Pressure Campaign 0.139 -0.031 -0.816
(0.242) (0.277) (0.691)
Public -0.003 0.199 -0.445
(0.262) (0.294) (0.595)
Coalition 0.358 0.255 0.074
(0.496) (0.528) (0.487)
Log(Coalition Size) -0.225+ -0.168 -0.113
(0.117) (0.133) (0.111)
Members of Congress -0.025 -0.029 -0.018
(0.018) (0.022) (0.018)
Supports Rule 0.614*** 0.633*** 0.364*
(0.167) (0.177) (0.178)
Pressure Campaign × Public -0.847* -0.810* 0.701
(0.370) (0.398) (0.802)
Bush 0.461
(0.693)
Trump -1.318*
(0.605)
Pressure Campaign × Bush -0.262
(1.220)
Pressure Campaign × Trump 1.344+
(0.749)
Bush × Public -0.985
(1.009)
Trump × Public 0.854
(0.642)
Campaign × Public × Bush -0.534
(1.531)
Campaign × Public × Trump -2.533**
(0.860)
Num.Obs. 3420 3420 3420
R2 0.863 0.880 0.868
R2 Adj. 0.313 0.380 0.329
R2 Within 0.075 0.079 0.131
R2 Pseudo
AIC 12434.5 12028.7 12334.7
BIC 29251.0 28955.7 29188.0
Log.Lik. -3477.244 -3256.367 -3421.360
Std. Errors Clustered (org_name) Clustered (org_name) Clustered (org_name)
FE: agency X X
FE: docket_id X
FE: org_name X X X
FE: president X
+ p < 0.1, * p < 0.05, ** p < 0.01, *** p < 0.001

Like the coalition-level models in Table 7, organizations were more likely to get their desired result when they supported the proposed rule. The effect sizes are smaller in the difference-in-difference specification but significantly different from zero.

The most notable result from models 1 and 2 is the negative correlation between lobbying success and the number of pressure campaigns organized by public interest groups (Pressure Campaign × Public). As discussed above, it is likely due to public interest campaigns “going down fighting,” whereas private interest campaigns are more likely to only lobby when they think they anticipate it increasing their chances of winning. Unlike private interest campaigns, some public interest campaigns are not trying to influence policy but instead build power for future policy fights (see Chapter ??. The fact that organizations are more likely to get the outcome they seek when they support the draft rule makes sense because the agency is more likely to be sympathetic to their requests.

The model in the third column of Table 9 clarifies that the large negative correlation between public interest campaigns and lobbying success is a result of losing campaigns during the Trump administration. Model 3 includes the president as a dummy variable interacted with the indicators for the pressure campaign and coalition type (whereas Models 1 and 2 estimate fixed effects for each President). First, it shows that the average organization was less likely to see its desired policy changes under President Trump than under President Obama. This is likely due to asymmetry in organizations in this sample of high-salience rules, with far more organizations on the political left than the political right in this sample of rules. Supporting this conclusion, there is a positive interaction between the indicators for a pressure campaign and for President Trump (Pressure Campaign × Trump) for private interest groups (the omitted category), but a very large negative relationship for public interest group campaigns under President Trump (Pressure Campaign × Public × Trump).

Conclusion

Public pressure campaigns appear to help private interests more than public interests on average. However, this correlation could have at least two observationally equivalent causes. First, my theory predicts a strong selection effect. By nature, public interest groups need to build grassroots power, contact lists, and a donor base to persist to fight the next day. Unlike businesses, public interest organizations thus have incentives to launch pressure campaigns even when they have little hope of influencing policy. Second, pressure campaigns from business groups are rarer and perhaps more surprising. Formal models of bureaucratic policymaking suggest that policymakers should be most affected by surprising information. Policymakers may be more likely to expect campaigns from public interest groups and even have prior beliefs that the public is on their side. A large segment of the public voicing support for a cause that bureaucrats perceived as narrow may be more likely to make them question or revise their prior beliefs about the public or the politics of their proposed policy.

Even among private interest groups and businesses, however, I find mixed evidence that public pressure campaigns increase lobbying success. There are several possible explanations for this result. For example, it may be that agencies may not be persuaded by political information, either because of the institutions for dealing with public input or decisionmakers’ biases. Alternatively, the relatively small sample may simply lack the power to reliably estimate small effects.

I do find evidence that public pressure campaigns coalitions mobilize support from members of Congress and reduce overt opposition by members of Congress. However, legislators disproportionately align with private interest coalitions (i.e., coalitions led by business interests), not the public interest coalitions that run most public pressure campaigns.

Additional Descriptives


Organization-level summary counts:

# org comments by type 
comments_coded %>% filter(comment_type == "Org") %>%  
  mutate(org_type = str_remove(org_type, ";.*")) %>%
  count(org_type, sort =T) %>% 
  filter(n>1) %>% 
  kable3(caption = " ")
Table 10:
org_type n
Ngo 1,806
Gov 731
Corp Group 619
Corp 448
NA 108
Org 8
Elected 4
Corp Groups 2
Gov Agency 2
# org comments by sub-type
comments_coded %>% filter(comment_type == "Org") %>%  
  filter(str_detect(org_type, ";")) %>% 
  mutate(org_type_detailed = org_type) %>%
  count(org_type_detailed, sort =T) %>% 
  kable3(caption = " ")
Table 10:
org_type_detailed n
Ngo;Advocacy 503
Gov;Local 214
Gov;State 201
Ngo;Legal 111
Ngo;Credit Union 80
Gov;Tribe 76
Ngo;Professional 75
Ngo;Coalition 61
Ngo;University 56
Ngo;Membership 54
Ngo; Advocacy 47
Ngo;Faith 36
Ngo;Thinktank 36
Corp;Corp 35
Gov;Federal 34
Ngo;Union 34
Gov;Tribe;Ej 33
Gov;State Agency 32
Corp;Law Firm 28
Ngo;Advocacy;Membership 28
Ngo;Membership;Advocacy 21
Ngo;Legal;Advocacy 19
Corp Group;Coalition 17
Gov;Federal;Regional 17
Gov;Local;Coalition 17
Corp;Legal 16
Corp;Bank 15
Ngo;Legal;Membership 14
Corp;Small Corp 13
Ngo;Environmental 13
Ngo;Pressure Group 13
Ngo;Think Tank 12
Corp;Energy 11
Ngo;Advocacy;Coalition 11
Ngo;Philanthropy 11
Ngo;Advocacy;Professional 9
Ngo;Ej 9
Corp; Bank 8
Gov; State 8
Ngo; Credit Union 8
Ngo;Professional;Membership 8
Ngo; Environmental Advocacy 7
Corp Group;Energy 6
Corp Group;Professional 6
Ngo;Advocacy;Ngo;Membership 6
Ngo;Healthcare 6
Corp Group; Trade Association 5
Corp Group;Membership;Professional 5
Gov; Tribe 5
Gov;State;Coalition 5
Ngo;Advocacy;Pressure Group 5
Ngo;Conservation 5
Ngo;Medical 5
Ngo;Trade Association 5
Ngo;Tribe 5
Corp Group;Membership 4
Corp;Thinktank 4
Gov; County 4
Gov;Local;Ej 4
Gov;Local;Tribe;Ej 4
Gov;State;Agency 4
Gov;State;Ej 4
Ngo; Environemental Advocacy 4
Ngo;Advocacy;Legal 4
Ngo;Church 4
Ngo;Coalition;Advocacy 4
Ngo;Membership;Pressure 4
Ngo;Tribe;Ej;Advocacy 4
Ngo;University;Legal 4
Corp;Busines 3
Corp;Gov;Tribal;Ej 3
Corp;Medical 3
Gov; Local 3
Gov;City 3
Gov;County 3
Gov;Local;Ngo 3
Ngo; 3
Ngo; Environemental Protection 3
Ngo; Volunteer 3
Ngo;Advocacy;Ej 3
Ngo;Advocacy;Faith 3
Ngo;Advocacy;Ngo 3
Ngo;Corp Group 3
Ngo;Education 3
Ngo;Federal Credit Union 3
Ngo;Financial Services 3
Ngo;Grassroots 3
Ngo;Legal;University 3
Org;Finance 3
Corp Group; Advoacy 2
Corp Group; Bank 2
Corp Group; Chamber Of Commerce 2
Corp Group; Energy 2
Corp Group; Farmers 2
Corp Group; Natural Resoruces; Mining Association 2
Corp Group; Ranchers 2
Corp Group;Association; Livestock 2
Corp Group;Ngo 2
Corp Group;Professional;Membership 2
Corp; Oil And Gas 2

Number of supportive comments

coalitions_coded %>% 
  drop_na(coalition_type, Coalition_Position) %>% 
  distinct(coalition_comment, coalition_type, coalition_size, coalition_success, coalition_comments, agency, Coalition_Position) %>% 
  ungroup() %>%
  ggplot() +
  aes(y = coalition_success, x = log(coalition_comments), color = coalition_type) +
  geom_jitter(aes(size = coalition_size), alpha = .5) +
  geom_smooth(se = TRUE, method = "lm")

coalitions_coded %>% 
  drop_na(coalition_type, Coalition_Position) %>% 
  distinct(coalition_comment, coalition_type, coalition_size, coalition_success, coalition_comments, agency, Coalition_Position) %>% 
  ungroup() %>%
  ggplot() +
  aes(y = coalition_success, x = log(coalition_comments), color = coalition_type) +
  geom_jitter(aes(size = coalition_size), alpha = .5) +
  geom_smooth(se = FALSE, method = "lm")+ 
  facet_grid(Coalition_Position ~ .)

coalitions_coded %>% 
  drop_na(coalition_type, Coalition_Position) %>% 
  distinct(coalition_comment, coalition_type, coalition_size, coalition_success, coalition_comments, agency, president, Coalition_Position) %>% 
  ungroup() %>%
  ggplot() +
  aes(y = coalition_success, x = log(coalition_comments), color = coalition_type) +
  geom_jitter(aes(size = coalition_size), alpha = .5) +
  geom_smooth(se = FALSE, method = "lm") + 
  #facet_wrap("president")  + 
  facet_grid(Coalition_Position ~ president)
Lobbying Success by Number of Supportive CommentsLobbying Success by Number of Supportive CommentsLobbying Success by Number of Supportive Comments

Figure 7: Lobbying Success by Number of Supportive Comments

Coalition Size

(number of supportive organizations)

coalitions_coded %>% 
  drop_na(coalition_type, Coalition_Position) %>% 
  distinct(coalition_comment, coalition_type, coalition_size, coalition_success, coalition_comments, agency, president, Coalition_Position) %>% 
  ungroup() %>%
  ggplot() +
  aes(y = coalition_success, x = coalition_size, color = coalition_type) +
  geom_jitter(aes(size = coalition_comments ), alpha = .5) +
  geom_smooth(se = FALSE, method = "lm") + 
  facet_grid(Coalition_Position ~ .)+ 
  scale_size_continuous(labels = comma)

coalitions_coded %>% 
  drop_na(coalition_type, Coalition_Position) %>% 
  distinct(coalition_comment, coalition_type, coalition_size, coalition_success, coalition_comments, agency, president, Coalition_Position) %>% 
  ungroup() %>%
  ggplot() +
  aes(y = coalition_success, x = coalition_size, color = coalition_type) +
  geom_jitter(aes(size = coalition_comments ), alpha = .5) +
  geom_smooth(se = FALSE, method = "lm") + 
  #facet_wrap("president") + 
  facet_grid(Coalition_Position ~ president)+ 
  scale_size_continuous(labels = comma)
Lobbying Success by Number of Supportive CommentsLobbying Success by Number of Supportive Comments

Figure 8: Lobbying Success by Number of Supportive Comments

The correlation between coalition size and the total number of comments

The total number of form-letter comments is highly correlated with the number of organizations in a coalition.

The total number of comments excludes organization comments.

coalitions_coded %>% 
  ggplot() + 
  aes(x = coalition_size, y = comments) +
  geom_point() + 
  geom_smooth(method = "lm") + 
  labs(y = "Mass Comments",
       x = "Coalition Size\n(number of organizations)")

coalitions_coded %>% 
  mutate(comments = comments - coalition_size) %>%
  ggplot() + 
  aes(x = log(coalition_size), y = log(coalition_comments)) +
  geom_point() + 
  geom_smooth(method = "lm") + 
  labs(y = "Logged Mass Comments",
       x = "Logged Coalition Size\n(number of organizations)")

<!– # Extra Methods

DV = Comments from members of Congress

Hypothesis 1 The scale of public engagement moderates elected officials’ engagement in agency rulemaking engagement.

Preliminary finding: The size of the lobbying coalition (the number of organizations) is positively correlated with the number of members of Congress who engage. When we account for variation in coalition size, there is no evidence that the total number of comments is related to the number of comments from members of Congress.

The simplest model of the relationship between congressional attention and public attention is a model estimating the count of legislator letters as a function of features of the rulemaking, including the total number of public comments. The number of letters from members of Congress would be a count process; this would be a Poisson or negative binomial regression.

In equation (5), \(y_{j}\) is a count of the number of legislator comments on a proposed rule \(j\), \(\beta_1\) is the effect of a one-unit increase in the logged number of public comments on proposed rule \(j\), and \(\eta\) is a vector of coefficients on other factors (\(X_{j}\)) that may lead legislators to comment.

\[ y_{j}= \beta_0 + \beta_1 \text{log(Public comments)}_{j} + \eta X_{j} + \epsilon_{j} \tag{5} \]


Alternatively, if we want to control for legislator characteristics that may make them more or less likely to comment on a rule, we can make members of Congress the unit of analysis. The dependent variable is now whether or not a given legislator \(i\) commented on the proposed rule \(j\). The relationship between public engagement and legislator engagement can be modeled by Equation (6), where \(Pr(Comment_{ij})\) is the probability that legislator \(i\) comments on a proposed rule \(j\), \(\beta_1\) is the effect of a one-unit increase in the logged number of public comments on proposed rule \(j\), and \(\eta\) is a vector of coefficients on other factors (\(X_{ij}\)) that may affect whether a legislator engages.

\[logit(Pr(\text{Legislator comment}_{ij})) = \beta_0 + \beta_1 \text{log(Public comments)}_{ij} + \eta X_{ij} + \epsilon_{ij} \tag{6}\]


Hypothesis 2 Public pressure campaigns attract oversight from allies. The more comments supporting a position, the more likely principals holding that position are to engage.
Hypothesis 3 Public pressure campaigns reduce oversight from opponents. The more comments opposing a position, the less likely principals holding that position are to engage.

The simplest model of the relationship between congressional attention and public support or opposition to a proposed rule would be to model the net count of legislator letters supporting and opposing the proposed as a function of features of the rulemaking, including the net number of public comments supporting and opposing. As the number of letters from members of Congress would be a count process, this would be Poisson or negative binomial regression.

The model is the same as equation (5) except that \(y_{j}\) is now the net number of legislator comments supporting a proposed rule \(j\), and \(\beta_1\) is now the effect of a one-unit increase in the logged net number of public comments supporting proposed rule \(j\).


With a measure of the likely position on each rule (for example, if promulgated by a co-partisan administration), the individual legislator can be the unit of analysis. The probability that legislator \(i\) will comment on rule \(j\), given their position \(p_{ij}\) on a proposed rule \(j\) (\(Pr(Comment_{ij}i|p_{ij})\)), is modeled in equation (7). Hypothesis 2 implies that \(\beta_1\) is positive and Hypothesis 3 implies that \(\beta_2\) is negative.

\[logit(Pr(\text{Legislator Comment}_{ij}|p_{ij})) = \beta_0 + \beta_1 \text{Comments supporting } p_{ij} + \beta_2 \text{Comments opposing } p_{ij} + \eta X_{ij} + \epsilon_{ij} \tag{7}\]

–>

Additional Results

Interact quadratic term with coalition type

Models 5 and 6 in the main coalition-level results (Table 3.7 in Chapter 3, reproduced as Table 7 above) are estimated without interaction terms for the number of comments and coalition type. Table 11 shows that when we include these interactions \(R^2\) and Log-Likelihood are unchanged and errors on estimates for the numbrer of comments comments\(^2\) both increase. Still, Table 11 may be a better specification because we do expect different

#mcfe-success

# coalition success with agency and president FE
mc1 <- feols(coalition_success ~ 
          campaign_*coalition_type + 
          # campaign_*coalition_business_ +
          # log(comments + 1)*coalition_type
          # log(comments + 1)*coalition_business_ + 
          # comments * coalition_type + 
          # comments^2 * coalition_type +
          # comments^2 * coalition_business +
          coalition_ + log(coalition_size) + #  coalition_size^2 + 
          Coalition_Position + 
          # comment_length + 
          coalition_unopposed
          # Agency and president FE 
          | agency + president, #+ president, 
        data = coalitions_coded)

mc2 <- feols(coalition_success ~ 
          #campaign_*coalition_type + # m1
          campaign_*coalition_business_ + # m2
          # log(comments + 1)*coalition_type # m3
          # log(comments + 1)*coalition_business_ + # m4
          # comments + comments^2 + coalition_type + #m5
          # comments + comments^2 + coalition_business_ + #m6
          coalition_ + log(coalition_size) + #  coalition_size^2 + 
          Coalition_Position + 
          # comment_length + 
          coalition_unopposed
          # Agency and president FE 
          | agency + president, #+ president, 
        data = coalitions_coded)

mc3 <- feols(coalition_success ~ 
          #campaign_*coalition_type + # m1
          # campaign_*coalition_business_ + # m2
          log(comments + 1)*coalition_type + # m3
          # log(comments + 1)*coalition_business_ + # m4
          # comments + comments^2 + coalition_type + #m5
          # comments + comments^2 + coalition_business_ + #m6
          coalition_ + log(coalition_size) + #  coalition_size^2 + 
          Coalition_Position + 
          # comment_length + 
          coalition_unopposed
          # Agency and president FE 
          | agency + president,# + president, 
        data = coalitions_coded)

mc4 <- feols(coalition_success ~ 
          #campaign_*coalition_type + # m1
          #campaign_*coalition_business_ + # m2
          # log(comments + 1)*coalition_type + # m3
          log(comments + 1)*coalition_business_ + # m4
          # comments + comments^2 + coalition_type + #m5
          # comments + comments^2 + coalition_business_ + #m6
          coalition_ + log(coalition_size) + #  coalition_size^2 + 
          Coalition_Position + 
          # comment_length + 
          coalition_unopposed
          # Agency and president FE 
          | agency + president,# + president, 
        data = coalitions_coded)

mc5 <- feols(coalition_success ~ 
          # campaign_*coalition_type + # m1
          # campaign_*coalition_business_ + # m2
          # log(comments + 1)*coalition_type + # m3
          # log(comments + 1)*coalition_business_ + # m4
          comments100k*coalition_type + 
          coalition_type*comments100k^2 + #m6          # comments + comments^2 + coalition_business_ + #m6
          coalition_ + log(coalition_size) + #  coalition_size^2 + 
          Coalition_Position + 
          # comment_length + 
          coalition_unopposed
          # Agency and president FE 
          | agency + president, 
        data = coalitions_coded)

mc6 <- feols(coalition_success ~ 
          #campaign_*coalition_type + # m1
          # campaign_*coalition_business_ + # m2
          # log(comments + 1)*coalition_type + # m3
          # log(comments + 1)*coalition_business_ + # m4
          # comments + comments^2 + coalition_type + #m5
          comments100k*coalition_business_ + 
          coalition_business_*comments100k^2 + #m6
          coalition_ + log(coalition_size) + #  coalition_size^2 + 
          Coalition_Position + 
          # comment_length + 
          coalition_unopposed
          # Agency and president FE 
          | agency + president, 
        data = coalitions_coded)

modelsFE <- list(mc1, mc2, mc3, mc4, mc5, mc6)

# paper table fixest
modelsummary::modelsummary( modelsFE, 
                            stars = TRUE, 
                            #coef_map =
                            coef_rename =  cm,
                            gof_omit = "R2 .*|IC",
                          add_rows = rowsFE, 
                          title = "OLS Models of Coalition-Level Lobbying Success",
                          notes = "") #%>% kable2(file = "mc-success")
Table 11: OLS Models of Coalition-Level Lobbying Success
Model 1 Model 2 Model 3 Model 4 Model 5 Model 6
Dependent Variable Lobbying Success Lobbying Success Lobbying Success Lobbying Success Lobbying Success Lobbying Success
Pressure Campaign 0.293 -0.857*
(0.319) (0.368)
Public 0.281 0.196 0.014
(0.332) (0.320) (0.275)
Coalition 0.027 -0.166 -0.011 -0.240 0.060 -0.248
(0.552) (0.595) (0.564) (0.605) (0.600) (0.653)
Log(Coalition Size) 0.206+ 0.267* 0.238+ 0.306* 0.140 0.255+
(0.116) (0.127) (0.127) (0.118) (0.133) (0.131)
Supports Rule 1.235*** 1.220** 1.221** 1.201** 1.230** 1.180**
(0.317) (0.322) (0.324) (0.320) (0.334) (0.343)
Unopposed 0.525* 0.522 0.604** 0.526+ 0.731** 0.718*
(0.207) (0.324) (0.181) (0.279) (0.196) (0.290)
Pressure Campaign × Public -1.337**
(0.462)
Business Coalition -0.010 -0.016 0.039
(0.330) (0.322) (0.319)
Pressure Campaign × Business 0.857
(0.515)
Log(Mass Comments) -0.043 -0.118***
(0.030) (0.028)
Log(Mass Comments) × Public -0.068+
(0.038)
Log(Mass Comments) × Business 0.076
(0.059)
Mass Comments -0.282 -1.941*
(0.439) (0.881)
(Mass Comments)^2 0.025 0.781
(0.047) (0.544)
Mass Comments*Public -0.264
(0.428)
coalition_typePublic:I(comments100k^2) 0.032
(0.048)
Mass Comments*Business 2478.854
(1589.210)
coalition_business_TRUE:I(comments100k^2) -2826.289
(1811.926)
Num.Obs. 252 211 252 211 252 211
R2 0.342 0.295 0.335 0.301 0.318 0.292
Log.Lik. -417.398 -357.471 -418.728 -356.466 -422.012 -357.816
Std. Errors Clustered (agency) Clustered (agency) Clustered (agency) Clustered (agency) Clustered (agency) Clustered (agency)
FE: agency X X X X X X
FE: president X X X X X X
+ p < 0.1, * p < 0.05, ** p < 0.01, *** p < 0.001
#mcfe-success-quadratic-pred
top10 = coalitions_coded %>% distinct(docket_id, agency) %>% count(agency) %>% slice_max(order_by = n, n =4) %>% pull(agency)

values = coalitions_coded %>% 
  expand(president, 
         #comments = c(0,1,10,100,1000,10000,100000),
         comments100k = seq(0, 10, by = .1),
         #coalition_business_,
         coalition_type,
         coalition_congress = 0,
         coalition_ = TRUE,
         coalition_size = 10,
         Coalition_Position,
         coalition_unopposed = TRUE,
         agency = top10
         ) %>% 
  mutate(agencyXpresident = paste(agency, president))

plot_quadratic <-  function(model){ 
  
  model %>% 
broom::augment(newdata = values, se_fit = TRUE) %>% 
  filter(president != "Bush",
         .fitted < 2) %>% 
  mutate(president = as.character(president)) %>%
  drop_na() %>% 
  ggplot() + 
  aes(x = comments100k*100, y = .fitted, color = coalition_type,
      #label = agency, 
      linetype = agency) + 
  #geom_point() + 
  geom_line() + 
  facet_grid(Coalition_Position ~ president) +
  labs(x = "Mass comments (Thousands)",
       y = "Predicted Lobbying Success",
       color = "Coalition Type", 
       linetype = "Agency")
}
plot_quadratic(mc5)

Split samples

When we estimate the same models as those presented in Table 7 with the sample split by whether the coalition supports or opposes the rule, results are surprisingly consistent for both samples. While some effect sizes change, none of the estimated that is significant at the .05 level changes sign.

Coalition size is a stronger predictor for supportive coalitions than opposing ones.

The negative relationship between using a pressure campaign and lobbying success appears to be mostly a function of campaigns opposing proposed rules. This aligns with the conclusion that campaigns that fail to affect policy are often “going down fighting.” However, the linear and quadratic terms for the number of mass comments are similar magnitudes, suggesting that very large coalitions opposing proposed rules may be more successful than smaller ones.

Coalitions Supporting Proposed Rules

#mc-success-pro
pro <- filter(coalitions_coded, Coalition_Position == "Supports Rule")
con <- filter(coalitions_coded, Coalition_Position == "Opposes Rule")

# coalition success with agency and president FE
mc1pro <- feols(coalition_success ~ 
          campaign_*coalition_type + 
          # campaign_*coalition_business_ +
          # log(comments + 1)*coalition_type
          # log(comments + 1)*coalition_business_ + 
          # comments * coalition_type + 
          # comments^2 * coalition_type +
          # comments^2 * coalition_business +
          coalition_ + log(coalition_size) + #  coalition_size^2 + 
          #Coalition_Position + 
          # comment_length + 
          coalition_unopposed #+ coalition_congress
          # Agency and president FE 
          | agency + president, #+ president, 
        data = pro)

mc2pro <- feols(coalition_success ~ 
          #campaign_*coalition_type + # m1
          campaign_*coalition_business_ + # m2
          # log(comments + 1)*coalition_type # m3
          # log(comments + 1)*coalition_business_ + # m4
          # comments + comments^2 + coalition_type + #m5
          # comments + comments^2 + coalition_business_ + #m6
          coalition_ + log(coalition_size) + #  coalition_size^2 + 
          #Coalition_Position + 
          # comment_length + 
          coalition_unopposed#+ coalition_congress
          # Agency and president FE 
          | agency + president, #+ president, 
        data = pro)

mc3pro <- feols(coalition_success ~ 
          #campaign_*coalition_type + # m1
          # campaign_*coalition_business_ + # m2
          log(comments + 1)*coalition_type + # m3
          # log(comments + 1)*coalition_business_ + # m4
          # comments + comments^2 + coalition_type + #m5
          # comments + comments^2 + coalition_business_ + #m6
          coalition_ + log(coalition_size) + #  coalition_size^2 + 
          #Coalition_Position + 
          # comment_length + 
          coalition_unopposed#+ coalition_congress
          # Agency and president FE 
          | agency + president,# + president, 
        data = pro)

mc4pro <- feols(coalition_success ~ 
          #campaign_*coalition_type + # m1
          #campaign_*coalition_business_ + # m2
          # log(comments + 1)*coalition_type + # m3
          log(comments + 1)*coalition_business_ + # m4
          # comments + comments^2 + coalition_type + #m5
          # comments + comments^2 + coalition_business_ + #m6
          coalition_ + log(coalition_size) + #  coalition_size^2 + 
          #Coalition_Position + 
          # comment_length + 
          coalition_unopposed#+ coalition_congress
          # Agency and president FE 
          | agency + president,# + president, 
        data = pro)

mc5pro <- feols(coalition_success ~ 
          # campaign_*coalition_type + # m1
          # campaign_*coalition_business_ + # m2
          # log(comments + 1)*coalition_type + # m3
          # log(comments + 1)*coalition_business_ + # m4
          comments100k + comments100k^2 + coalition_type + #m5
          # comments + comments^2 + coalition_business_ + #m6
          coalition_ + log(coalition_size) + #  coalition_size^2 + 
          #Coalition_Position + 
          # comment_length + 
          coalition_unopposed#+ coalition_congress
          # Agency and president FE 
          | agency + president, 
        data = pro)

mc6pro <- feols(coalition_success ~ 
          #campaign_*coalition_type + # m1
          # campaign_*coalition_business_ + # m2
          # log(comments + 1)*coalition_type + # m3
          # log(comments + 1)*coalition_business_ + # m4
          # comments + comments^2 + coalition_type + #m5
          comments100k + comments100k^2 + coalition_business_ + #m6
          coalition_ + log(coalition_size) + #  coalition_size^2 + 
          #Coalition_Position + 
          # comment_length + 
          coalition_unopposed#+ coalition_congress
          # Agency and president FE 
          | agency + president, 
        data = pro)


modelsFEpro <- list(mc1pro, mc2pro, mc3pro, mc4pro, mc5pro, mc6pro)

# paper table fixest
modelsummary::modelsummary( modelsFEpro, 
                            stars = TRUE, 
                            #coef_map =
                            coef_rename =  cm,
                            gof_omit = "R2 .*|IC",
                          add_rows = rowsFE, 
                          title = "OLS Models of Coalition-Level Lobbying Success for Coalitions Supporting Proposed Rules",
                          notes = "")
Table 12: OLS Models of Coalition-Level Lobbying Success for Coalitions Supporting Proposed Rules
Model 1 Model 2 Model 3 Model 4 Model 5 Model 6
Dependent Variable Lobbying Success Lobbying Success Lobbying Success Lobbying Success Lobbying Success Lobbying Success
Pressure Campaign 0.379 -0.214
(0.372) (0.551)
Public 0.272 0.252 0.221
(0.322) (0.334) (0.294)
Coalition -0.293 -0.676 -0.331 -0.768 -0.326 -0.955
(0.524) (0.514) (0.535) (0.554) (0.560) (0.592)
Log(Coalition Size) 0.265* 0.383+ 0.313* 0.434* 0.291* 0.520**
(0.109) (0.199) (0.138) (0.173) (0.110) (0.142)
Unopposed -0.419 -0.516 -0.393 -0.554 -0.331 -0.528
(0.383) (0.505) (0.371) (0.529) (0.324) (0.468)
Pressure Campaign × Public -0.850
(0.581)
Business Coalition -0.036 -0.142 -0.052
(0.389) (0.422) (0.384)
Pressure Campaign × Business 0.695
(0.757)
Log(Mass Comments) -0.011 -0.068
(0.059) (0.048)
Log(Mass Comments) × Public -0.052
(0.061)
Log(Mass Comments) × Business 0.260
(0.228)
Mass Comments -1.372** 1.505
(0.433) (1.156)
(Mass Comments)^2 0.394** -1.580+
(0.138) (0.763)
Num.Obs. 150 126 150 126 150 126
R2 0.401 0.365 0.399 0.373 0.402 0.378
Log.Lik. -236.289 -204.889 -236.508 -204.044 -236.205 -203.568
Std. Errors Clustered (agency) Clustered (agency) Clustered (agency) Clustered (agency) Clustered (agency) Clustered (agency)
FE: agency X X X X X X
FE: president X X X X X X
+ p < 0.1, * p < 0.05, ** p < 0.01, *** p < 0.001
plot_quadratic(mc5pro)

Coalitions Opposing Proposed Rules

#mc-success-con

# coalition success with agency and president FE
mc1con <- feols(coalition_success ~ 
          campaign_*coalition_type + 
          # campaign_*coalition_business_ +
          # log(comments + 1)*coalition_type
          # log(comments + 1)*coalition_business_ + 
          # comments * coalition_type + 
          # comments^2 * coalition_type +
          # comments^2 * coalition_business +
          coalition_ + log(coalition_size) + #  coalition_size^2 + 
          #Coalition_Position + 
          # comment_length + 
          coalition_unopposed #+ coalition_congress
          # Agency and president FE 
          | agency + president, #+ president, 
        data = con)

mc2con <- feols(coalition_success ~ 
          #campaign_*coalition_type + # m1
          campaign_*coalition_business_ + # m2
          # log(comments + 1)*coalition_type # m3
          # log(comments + 1)*coalition_business_ + # m4
          # comments + comments^2 + coalition_type + #m5
          # comments + comments^2 + coalition_business_ + #m6
          coalition_ + log(coalition_size) + #  coalition_size^2 + 
          #Coalition_Position + 
          # comment_length + 
          coalition_unopposed#+ coalition_congress
          # Agency and president FE 
          | agency + president, #+ president, 
        data = con)

mc3con <- feols(coalition_success ~ 
          #campaign_*coalition_type + # m1
          # campaign_*coalition_business_ + # m2
          log(comments + 1)*coalition_type + # m3
          # log(comments + 1)*coalition_business_ + # m4
          # comments + comments^2 + coalition_type + #m5
          # comments + comments^2 + coalition_business_ + #m6
          coalition_ + log(coalition_size) + #  coalition_size^2 + 
          #Coalition_Position + 
          # comment_length + 
          coalition_unopposed#+ coalition_congress
          # Agency and president FE 
          | agency + president,# + president, 
        data = con)

mc4con <- feols(coalition_success ~ 
          #campaign_*coalition_type + # m1
          #campaign_*coalition_business_ + # m2
          # log(comments + 1)*coalition_type + # m3
          log(comments + 1)*coalition_business_ + # m4
          # comments + comments^2 + coalition_type + #m5
          # comments + comments^2 + coalition_business_ + #m6
          coalition_ + log(coalition_size) + #  coalition_size^2 + 
          #Coalition_Position + 
          # comment_length + 
          coalition_unopposed#+ coalition_congress
          # Agency and president FE 
          | agency + president,# + president, 
        data = con)

mc5con <- feols(coalition_success ~ 
          # campaign_*coalition_type + # m1
          # campaign_*coalition_business_ + # m2
          # log(comments + 1)*coalition_type + # m3
          # log(comments + 1)*coalition_business_ + # m4
          comments100k + comments100k^2 + coalition_type + #m5
          # comments + comments^2 + coalition_business_ + #m6
          coalition_ + log(coalition_size) + #  coalition_size^2 + 
          #Coalition_Position + 
          # comment_length + 
          coalition_unopposed#+ coalition_congress
          # Agency and president FE 
          | agency + president, 
        data = con)

mc6con <- feols(coalition_success ~ 
          #campaign_*coalition_type + # m1
          # campaign_*coalition_business_ + # m2
          # log(comments + 1)*coalition_type + # m3
          # log(comments + 1)*coalition_business_ + # m4
          # comments + comments^2 + coalition_type + #m5
          comments100k + comments100k^2 + coalition_business_ + #m6
          coalition_ + log(coalition_size) + #  coalition_size^2 + 
          #Coalition_Position + 
          # comment_length + 
          coalition_unopposed#+ coalition_congress
          # Agency and president FE 
          | agency + president, 
        data = con)


modelsFEcon <- list(mc1con, mc2con, mc3con, mc4con, mc5con, mc6con)

# paper table fixest
modelsummary::modelsummary( modelsFEcon, 
                            stars = TRUE, 
                            #coef_map =
                            coef_rename =  cm,
                            gof_omit = "R2 .*|IC",
                          add_rows = rowsFE, 
                          title = "OLS Models of Coalition-Level Lobbying Success for Coalitions Opposing Proposed Rules",
                          notes = "")
Table 13: OLS Models of Coalition-Level Lobbying Success for Coalitions Opposing Proposed Rules
Model 1 Model 2 Model 3 Model 4 Model 5 Model 6
Dependent Variable Lobbying Success Lobbying Success Lobbying Success Lobbying Success Lobbying Success Lobbying Success
Pressure Campaign -0.173 -0.980+
(0.484) (0.484)
Public 0.796 0.564 0.283
(0.626) (0.582) (0.430)
Coalition -0.110 -0.186 -0.332 -0.443 -0.115 -0.330
(0.555) (0.917) (0.642) (0.959) (0.659) (0.953)
Log(Coalition Size) 0.305+ 0.263 0.347+ 0.368 0.166 0.257
(0.157) (0.226) (0.171) (0.240) (0.141) (0.220)
Pressure Campaign × Public -1.365+
(0.789)
Business Coalition -0.064 0.038 -0.005
(0.706) (0.661) (0.620)
Pressure Campaign × Business 0.170
(0.789)
Log(Mass Comments) -0.086 -0.124*
(0.064) (0.044)
Log(Mass Comments) × Public -0.061
(0.074)
Log(Mass Comments) × Business -0.106
(0.065)
Mass Comments -0.713* -2.221+
(0.299) (1.140)
(Mass Comments)^2 0.079* 0.539
(0.038) (1.184)
Num.Obs. 102 85 102 85 102 85
R2 0.570 0.531 0.567 0.542 0.541 0.536
Log.Lik. -138.599 -122.191 -138.954 -121.103 -142.025 -121.699
Std. Errors Clustered (agency) Clustered (agency) Clustered (agency) Clustered (agency) Clustered (agency) Clustered (agency)
FE: agency X X X X X X
FE: president X X X X X X
+ p < 0.1, * p < 0.05, ** p < 0.01, *** p < 0.001
plot_quadratic(mc5con)

Coalitions That Used Public Pressure Campaigns

#mc-success-pro
campaign <- filter(coalitions_coded, campaign_)

# coalition success with agency and president FE
mc1campaign <- feols(coalition_success ~ 
          campaign_*coalition_type + 
          # campaign_*coalition_business_ +
          # log(comments + 1)*coalition_type
          # log(comments + 1)*coalition_business_ + 
          # comments * coalition_type + 
          # comments^2 * coalition_type +
          # comments^2 * coalition_business +
          coalition_ + log(coalition_size) + #  coalition_size^2 + 
          #Coalition_Position + 
          # comment_length + 
          coalition_unopposed #+ coalition_congress
          # Agency and president FE 
          | agency + president, #+ president, 
        data = campaign)

mc2campaign <- feols(coalition_success ~ 
          #campaign_*coalition_type + # m1
          campaign_*coalition_business_ + # m2
          # log(comments + 1)*coalition_type # m3
          # log(comments + 1)*coalition_business_ + # m4
          # comments + comments^2 + coalition_type + #m5
          # comments + comments^2 + coalition_business_ + #m6
          coalition_ + log(coalition_size) + #  coalition_size^2 + 
          #Coalition_Position + 
          # comment_length + 
          coalition_unopposed#+ coalition_congress
          # Agency and president FE 
          | agency + president, #+ president, 
        data = campaign)

mc3campaign <- feols(coalition_success ~ 
          #campaign_*coalition_type + # m1
          # campaign_*coalition_business_ + # m2
          log(comments + 1)*coalition_type + # m3
          # log(comments + 1)*coalition_business_ + # m4
          # comments + comments^2 + coalition_type + #m5
          # comments + comments^2 + coalition_business_ + #m6
          coalition_ + log(coalition_size) + #  coalition_size^2 + 
          #Coalition_Position + 
          # comment_length + 
          coalition_unopposed#+ coalition_congress
          # Agency and president FE 
          | agency + president,# + president, 
        data = campaign)

mc4campaign <- feols(coalition_success ~ 
          #campaign_*coalition_type + # m1
          #campaign_*coalition_business_ + # m2
          # log(comments + 1)*coalition_type + # m3
          log(comments + 1)*coalition_business_ + # m4
          # comments + comments^2 + coalition_type + #m5
          # comments + comments^2 + coalition_business_ + #m6
          coalition_ + log(coalition_size) + #  coalition_size^2 + 
          #Coalition_Position + 
          # comment_length + 
          coalition_unopposed#+ coalition_congress
          # Agency and president FE 
          | agency + president,# + president, 
        data = campaign)

mc5campaign <- feols(coalition_success ~ 
          # campaign_*coalition_type + # m1
          # campaign_*coalition_business_ + # m2
          # log(comments + 1)*coalition_type + # m3
          # log(comments + 1)*coalition_business_ + # m4
          comments100k + comments100k^2 + coalition_type + #m5
          # comments + comments^2 + coalition_business_ + #m6
          coalition_ + log(coalition_size) + #  coalition_size^2 + 
          #Coalition_Position + 
          # comment_length + 
          coalition_unopposed#+ coalition_congress
          # Agency and president FE 
          | agency + president, 
        data = campaign)

mc6campaign <- feols(coalition_success ~ 
          #campaign_*coalition_type + # m1
          # campaign_*coalition_business_ + # m2
          # log(comments + 1)*coalition_type + # m3
          # log(comments + 1)*coalition_business_ + # m4
          # comments + comments^2 + coalition_type + #m5
          comments100k + comments100k^2 + coalition_business_ + #m6
          coalition_ + log(coalition_size) + #  coalition_size^2 + 
          #Coalition_Position + 
          # comment_length + 
          coalition_unopposed#+ coalition_congress
          # Agency and president FE 
          | agency + president, 
        data = campaign)


modelsFEcampaign <- list(mc1campaign, mc2campaign, mc3campaign, mc4campaign, mc5campaign, mc6campaign)

# paper table fixest
modelsummary::modelsummary( modelsFEcampaign, 
                            stars = TRUE, 
                            #coef_map =
                            coef_rename =  cm,
                            gof_omit = "R2 .*|IC",
                          add_rows = rowsFE, 
                          title = "OLS Models of Coalition-Level Lobbying Success for Coalitions that Used a Mass Comment Campaign",
                          notes = "")
Table 14: OLS Models of Coalition-Level Lobbying Success for Coalitions that Used a Mass Comment Campaign
Model 1 Model 2 Model 3 Model 4 Model 5 Model 6
Dependent Variable Lobbying Success Lobbying Success Lobbying Success Lobbying Success Lobbying Success Lobbying Success
Public -1.185* -0.160 -0.856
(0.531) (1.737) (0.552)
Log(Coalition Size) -0.365 -0.050 -0.138 0.309+ -0.091 0.172
(0.361) (0.124) (0.314) (0.153) (0.355) (0.700)
Business Coalition -1.942* -3.349*** -2.004+
(0.771) (0.656) (1.035)
Log(Mass Comments) -0.148* -0.358**
(0.052) (0.078)
Log(Mass Comments) × Public -0.041
(0.175)
Log(Mass Comments) × Business 0.157+
(0.071)
Mass Comments -0.691* -3.077*
(0.287) (1.009)
(Mass Comments)^2 0.061+ 1.749***
(0.033) (0.187)
Num.Obs. 49 22 49 22 49 22
R2 0.548 0.801 0.644 0.911 0.626 0.868
Log.Lik. -65.534 -18.701 -59.681 -9.850 -60.939 -14.154
Std. Errors Clustered (agency) Clustered (agency) Clustered (agency) Clustered (agency) Clustered (agency) Clustered (agency)
FE: agency X X X X X X
FE: president X X X X X X
+ p < 0.1, * p < 0.05, ** p < 0.01, *** p < 0.001
plot_quadratic(mc5campaign)

Add support from members of Congress

#mc-success-congress

# coalition success with agency and president FE
mc1 <- feols(coalition_success ~ 
          campaign_*coalition_type + 
          # campaign_*coalition_business_ +
          # log(comments + 1)*coalition_type
          # log(comments + 1)*coalition_business_ + 
          # comments * coalition_type + 
          # comments^2 * coalition_type +
          # comments^2 * coalition_business +
          coalition_ + log(coalition_size) + #  coalition_size^2 + 
          Coalition_Position + 
          # comment_length + 
          coalition_unopposed + coalition_congress
          # Agency and president FE 
          | agency + president, #+ president, 
        data = coalitions_coded)

mc2 <- feols(coalition_success ~ 
          #campaign_*coalition_type + # m1
          campaign_*coalition_business_ + # m2
          # log(comments + 1)*coalition_type # m3
          # log(comments + 1)*coalition_business_ + # m4
          # comments + comments^2 + coalition_type + #m5
          # comments + comments^2 + coalition_business_ + #m6
          coalition_ + log(coalition_size) + #  coalition_size^2 + 
          Coalition_Position + 
          # comment_length + 
          coalition_unopposed+ coalition_congress
          # Agency and president FE 
          | agency + president, #+ president, 
        data = coalitions_coded)

mc3 <- feols(coalition_success ~ 
          #campaign_*coalition_type + # m1
          # campaign_*coalition_business_ + # m2
          log(comments + 1)*coalition_type + # m3
          # log(comments + 1)*coalition_business_ + # m4
          # comments + comments^2 + coalition_type + #m5
          # comments + comments^2 + coalition_business_ + #m6
          coalition_ + log(coalition_size) + #  coalition_size^2 + 
          Coalition_Position + 
          # comment_length + 
          coalition_unopposed+ coalition_congress
          # Agency and president FE 
          | agency + president,# + president, 
        data = coalitions_coded)

mc4 <- feols(coalition_success ~ 
          #campaign_*coalition_type + # m1
          #campaign_*coalition_business_ + # m2
          # log(comments + 1)*coalition_type + # m3
          log(comments + 1)*coalition_business_ + # m4
          # comments + comments^2 + coalition_type + #m5
          # comments + comments^2 + coalition_business_ + #m6
          coalition_ + log(coalition_size) + #  coalition_size^2 + 
          Coalition_Position + 
          # comment_length + 
          coalition_unopposed+ coalition_congress
          # Agency and president FE 
          | agency + president,# + president, 
        data = coalitions_coded)

mc5 <- feols(coalition_success ~ 
          # campaign_*coalition_type + # m1
          # campaign_*coalition_business_ + # m2
          # log(comments + 1)*coalition_type + # m3
          # log(comments + 1)*coalition_business_ + # m4
          comments100k + comments100k^2 + coalition_type + #m5
          # comments + comments^2 + coalition_business_ + #m6
          coalition_ + log(coalition_size) + #  coalition_size^2 + 
          Coalition_Position + 
          # comment_length + 
          coalition_unopposed+ coalition_congress
          # Agency and president FE 
          | agency + president, 
        data = coalitions_coded)

mc6 <- feols(coalition_success ~ 
          #campaign_*coalition_type + # m1
          # campaign_*coalition_business_ + # m2
          # log(comments + 1)*coalition_type + # m3
          # log(comments + 1)*coalition_business_ + # m4
          # comments + comments^2 + coalition_type + #m5
          comments100k + comments100k^2 + coalition_business_ + #m6
          coalition_ + log(coalition_size) + #  coalition_size^2 + 
          Coalition_Position + 
          # comment_length + 
          coalition_unopposed+ coalition_congress
          # Agency and president FE 
          | agency + president, 
        data = coalitions_coded)


modelsFE <- list(mc1, mc2, mc3, mc4, mc5, mc6)

# paper table fixest
modelsummary::modelsummary( modelsFE, 
                            stars = TRUE, 
                            #coef_map =
                            coef_rename =  cm,
                            gof_omit = "R2 .*|IC",
                          add_rows = rowsFE, 
                          title = "OLS Models of Coalition-Level Lobbying Success",
                          notes = "")
Table 15: OLS Models of Coalition-Level Lobbying Success
Model 1 Model 2 Model 3 Model 4 Model 5 Model 6
Dependent Variable Lobbying Success Lobbying Success Lobbying Success Lobbying Success Lobbying Success Lobbying Success
Pressure Campaign 0.316 -0.743
(0.310) (0.439)
Public 0.307 0.246 0.080
(0.336) (0.329) (0.274)
Coalition 0.004 -0.233 -0.051 -0.330 -0.002 -0.385
(0.545) (0.543) (0.557) (0.573) (0.586) (0.625)
Log(Coalition Size) 0.230+ 0.318* 0.282+ 0.382** 0.203 0.381*
(0.122) (0.116) (0.138) (0.120) (0.146) (0.136)
Supports Rule 1.213*** 1.203** 1.189** 1.181** 1.183** 1.170**
(0.319) (0.322) (0.324) (0.317) (0.332) (0.337)
Unopposed 0.374 0.338 0.383 0.256 0.466+ 0.317
(0.260) (0.344) (0.253) (0.338) (0.245) (0.344)
Members of Congress -0.038 -0.049 -0.053 -0.064+ -0.065+ -0.080*
(0.033) (0.043) (0.033) (0.035) (0.035) (0.036)
Pressure Campaign × Public -1.319**
(0.468)
Business Coalition -0.039 -0.075 -0.010
(0.333) (0.335) (0.309)
Pressure Campaign × Business 0.742
(0.602)
Log(Mass Comments) -0.043 -0.114**
(0.032) (0.033)
Log(Mass Comments) × Public -0.068
(0.042)
Log(Mass Comments) × Business 0.077
(0.058)
Mass Comments -0.603** -1.592+
(0.212) (0.875)
(Mass Comments)^2 0.061* 0.436
(0.024) (0.545)
Num.Obs. 252 211 252 211 252 211
R2 0.345 0.298 0.341 0.308 0.325 0.301
Log.Lik. -416.901 -356.899 -417.736 -355.399 -420.631 -356.456
Std. Errors Clustered (agency) Clustered (agency) Clustered (agency) Clustered (agency) Clustered (agency) Clustered (agency)
FE: agency X X X X X X
FE: president X X X X X X
+ p < 0.1, * p < 0.05, ** p < 0.01, *** p < 0.001
plot_quadratic(mc5)

President*agency fixed effects

#mc-success-2-way-fe
coalitions_coded %<>% 
  mutate(agencyXpresident = paste(agency, president))

# coalition success with agency and president FE
mc1 <- feols(coalition_success ~ 
          campaign_*coalition_type + 
          # campaign_*coalition_business_ +
          # log(comments + 1)*coalition_type
          # log(comments + 1)*coalition_business_ + 
          # comments * coalition_type + 
          # comments^2 * coalition_type +
          # comments^2 * coalition_business +
          coalition_ + log(coalition_size) + #  coalition_size^2 + 
          Coalition_Position + 
          # comment_length + 
          coalition_unopposed
          # Agency and president FE 
          | agencyXpresident, #+ president, 
        data = coalitions_coded)

mc2 <- feols(coalition_success ~ 
          #campaign_*coalition_type + # m1
          campaign_*coalition_business_ + # m2
          # log(comments + 1)*coalition_type # m3
          # log(comments + 1)*coalition_business_ + # m4
          # comments + comments^2 + coalition_type + #m5
          # comments + comments^2 + coalition_business_ + #m6
          coalition_ + log(coalition_size) + #  coalition_size^2 + 
          Coalition_Position + 
          # comment_length + 
          coalition_unopposed
          # Agency and president FE 
          | agencyXpresident, #+ president, 
        data = coalitions_coded)

mc3 <- feols(coalition_success ~ 
          #campaign_*coalition_type + # m1
          # campaign_*coalition_business_ + # m2
          log(comments + 1)*coalition_type + # m3
          # log(comments + 1)*coalition_business_ + # m4
          # comments + comments^2 + coalition_type + #m5
          # comments + comments^2 + coalition_business_ + #m6
          coalition_ + log(coalition_size) + #  coalition_size^2 + 
          Coalition_Position + 
          # comment_length + 
          coalition_unopposed
          # Agency and president FE 
          | agencyXpresident,# + president, 
        data = coalitions_coded)

mc4 <- feols(coalition_success ~ 
          #campaign_*coalition_type + # m1
          #campaign_*coalition_business_ + # m2
          # log(comments + 1)*coalition_type + # m3
          log(comments + 1)*coalition_business_ + # m4
          # comments + comments^2 + coalition_type + #m5
          # comments + comments^2 + coalition_business_ + #m6
          coalition_ + log(coalition_size) + #  coalition_size^2 + 
          Coalition_Position + 
          # comment_length + 
          coalition_unopposed
          # Agency and president FE 
          | agencyXpresident,# + president, 
        data = coalitions_coded)

mc5 <- feols(coalition_success ~ 
          # campaign_*coalition_type + # m1
          # campaign_*coalition_business_ + # m2
          # log(comments + 1)*coalition_type + # m3
          # log(comments + 1)*coalition_business_ + # m4
          comments100k + comments100k^2 + coalition_type + #m5
          # comments + comments^2 + coalition_business_ + #m6
          coalition_ + log(coalition_size) + #  coalition_size^2 + 
          Coalition_Position + 
          # comment_length + 
          coalition_unopposed
          # Agency and president FE 
          | agencyXpresident, 
        data = coalitions_coded)

mc6 <- feols(coalition_success ~ 
          #campaign_*coalition_type + # m1
          # campaign_*coalition_business_ + # m2
          # log(comments + 1)*coalition_type + # m3
          # log(comments + 1)*coalition_business_ + # m4
          # comments + comments^2 + coalition_type + #m5
          comments100k + comments100k^2 + coalition_business_ + #m6
          coalition_ + log(coalition_size) + #  coalition_size^2 + 
          Coalition_Position + 
          # comment_length + 
          coalition_unopposed
          # Agency and president FE 
          | agencyXpresident, 
        data = coalitions_coded)

# paper table fixest
modelsummary::modelsummary( modelsFE, 
                            stars = TRUE, 
                            #coef_map =
                            coef_rename =  cm,
                            gof_omit = "R2 .*",
                          add_rows = rowsFE, 
                          title = "OLS Models of Coalition-Level Lobbying Success",
                          notes = "")
Table 16: OLS Models of Coalition-Level Lobbying Success
Model 1 Model 2 Model 3 Model 4 Model 5 Model 6
Dependent Variable Lobbying Success Lobbying Success Lobbying Success Lobbying Success Lobbying Success Lobbying Success
Pressure Campaign 0.316 -0.743
(0.310) (0.439)
Public 0.307 0.246 0.080
(0.336) (0.329) (0.274)
Coalition 0.004 -0.233 -0.051 -0.330 -0.002 -0.385
(0.545) (0.543) (0.557) (0.573) (0.586) (0.625)
Log(Coalition Size) 0.230+ 0.318* 0.282+ 0.382** 0.203 0.381*
(0.122) (0.116) (0.138) (0.120) (0.146) (0.136)
Supports Rule 1.213*** 1.203** 1.189** 1.181** 1.183** 1.170**
(0.319) (0.322) (0.324) (0.317) (0.332) (0.337)
Unopposed 0.374 0.338 0.383 0.256 0.466+ 0.317
(0.260) (0.344) (0.253) (0.338) (0.245) (0.344)
Members of Congress -0.038 -0.049 -0.053 -0.064+ -0.065+ -0.080*
(0.033) (0.043) (0.033) (0.035) (0.035) (0.036)
Pressure Campaign × Public -1.319**
(0.468)
Business Coalition -0.039 -0.075 -0.010
(0.333) (0.335) (0.309)
Pressure Campaign × Business 0.742
(0.602)
Log(Mass Comments) -0.043 -0.114**
(0.032) (0.033)
Log(Mass Comments) × Public -0.068
(0.042)
Log(Mass Comments) × Business 0.077
(0.058)
Mass Comments -0.603** -1.592+
(0.212) (0.875)
(Mass Comments)^2 0.061* 0.436
(0.024) (0.545)
Num.Obs. 252 211 252 211 252 211
R2 0.345 0.298 0.341 0.308 0.325 0.301
AIC 899.8 775.8 901.5 772.8 907.3 774.9
BIC 1016.3 879.7 1017.9 876.7 1023.7 878.8
Log.Lik. -416.901 -356.899 -417.736 -355.399 -420.631 -356.456
Std. Errors Clustered (agency) Clustered (agency) Clustered (agency) Clustered (agency) Clustered (agency) Clustered (agency)
FE: agency X X X X X X
FE: president X X X X X X
+ p < 0.1, * p < 0.05, ** p < 0.01, *** p < 0.001
plot_quadratic(mc5)

President indicators

# mc-success-president

# coalition success with agency and president FE
mc1 <- feols(coalition_success ~ 
          campaign_*coalition_type + 
            president + 
          # campaign_*coalition_business_ +
          # log(comments + 1)*coalition_type
          # log(comments + 1)*coalition_business_ + 
          # comments * coalition_type + 
          # comments^2 * coalition_type +
          # comments^2 * coalition_business +
          coalition_ + log(coalition_size) + #  coalition_size^2 + 
          Coalition_Position + 
          # comment_length + 
          coalition_unopposed
          # Agency and president FE 
          | agency, #+ president, 
        data = coalitions_coded)

mc2 <- feols(coalition_success ~ 
          #campaign_*coalition_type + # m1
          campaign_*coalition_business_ +
           president +# m2
          # log(comments + 1)*coalition_type # m3
          # log(comments + 1)*coalition_business_ + # m4
          # comments + comments^2 + coalition_type + #m5
          # comments + comments^2 + coalition_business_ + #m6
          coalition_ + log(coalition_size) + #  coalition_size^2 + 
          Coalition_Position + 
          # comment_length + 
          coalition_unopposed
          # Agency and president FE 
          | agency, #+ president, 
        data = coalitions_coded)

mc3 <- feols(coalition_success ~ 
          #campaign_*coalition_type + # m1
          # campaign_*coalition_business_ + # m2
          log(comments + 1)*coalition_type+ # m3
            president +
          # log(comments + 1)*coalition_business_ + # m4
          # comments + comments^2 + coalition_type + #m5
          # comments + comments^2 + coalition_business_ + #m6
          coalition_ + log(coalition_size) + #  coalition_size^2 + 
          Coalition_Position + 
          # comment_length + 
          coalition_unopposed
          # Agency and president FE 
          | agency,# + president, 
        data = coalitions_coded)

mc4 <- feols(coalition_success ~ 
          #campaign_*coalition_type + # m1
          #campaign_*coalition_business_ + # m2
          # log(comments + 1)*coalition_type + # m3
          log(comments + 1)*coalition_business_ + # m4
           president+
          # comments + comments^2 + coalition_type + #m5
          # comments + comments^2 + coalition_business_ + #m6
          coalition_ + log(coalition_size) + #  coalition_size^2 + 
          Coalition_Position + 
          # comment_length + 
          coalition_unopposed
          # Agency and president FE 
          | agency,# + president, 
        data = coalitions_coded)

mc5 <- feols(coalition_success ~ 
          # campaign_*coalition_type + # m1
          # campaign_*coalition_business_ + # m2
          # log(comments + 1)*coalition_type + # m3
          # log(comments + 1)*coalition_business_ + # m4
          comments100k + comments100k^2 + coalition_type+ #m5
          president +
          # comments + comments^2 + coalition_business_ + #m6
          coalition_ + log(coalition_size) + #  coalition_size^2 + 
          Coalition_Position + 
          # comment_length + 
          coalition_unopposed
          # Agency and president FE 
          | agency , 
        data = coalitions_coded)

mc6 <- feols(coalition_success ~ 
          #campaign_*coalition_type + # m1
          # campaign_*coalition_business_ + # m2
          # log(comments + 1)*coalition_type + # m3
          # log(comments + 1)*coalition_business_ + # m4
          # comments + comments^2 + coalition_type + #m5
          comments100k + comments100k^2 + coalition_business_+ #m6
           president+
          coalition_ + log(coalition_size) + #  coalition_size^2 + 
          Coalition_Position + 
          # comment_length + 
          coalition_unopposed
          # Agency and president FE 
          | agency, 
        data = coalitions_coded)

models_president <- list(mc1, mc2, mc3, mc4, mc5, mc6)


# paper table fixest
modelsummary::modelsummary( models_president, 
                            stars = TRUE, 
                            #coef_map =
                            coef_rename =  cm,
                            gof_omit = "R2 .*",
                          add_rows = rowsFE, 
                          notes = "") %>% 
  row_spec(row = 1, bold = T) #%>% kable2(file = "mc-success")
Model 1 Model 2 Model 3 Model 4 Model 5 Model 6
Dependent Variable Lobbying Success Lobbying Success Lobbying Success Lobbying Success Lobbying Success Lobbying Success
Pressure Campaign 0.293 -0.857*
(0.319) (0.368)
Public 0.281 0.196 0.011
(0.332) (0.320) (0.267)
Bush -1.093*** -1.047*** -1.189*** -1.100*** -1.076*** -1.022***
(0.177) (0.159) (0.207) (0.167) (0.231) (0.183)
Trump -0.664*** -0.757** -0.695*** -0.813** -0.608*** -0.737**
(0.150) (0.237) (0.151) (0.249) (0.140) (0.251)
Coalition 0.027 -0.166 -0.011 -0.240 0.057 -0.246
(0.552) (0.595) (0.564) (0.605) (0.596) (0.649)
Log(Coalition Size) 0.206+ 0.267* 0.238+ 0.306* 0.141 0.268+
(0.116) (0.127) (0.127) (0.118) (0.132) (0.133)
Supports Rule 1.235*** 1.220** 1.221** 1.201** 1.228** 1.187**
(0.317) (0.322) (0.324) (0.320) (0.332) (0.345)
Unopposed 0.525* 0.522 0.604** 0.526+ 0.730** 0.671*
(0.207) (0.324) (0.181) (0.279) (0.193) (0.285)
Pressure Campaign × Public -1.337**
(0.462)
Business Coalition -0.010 -0.016 0.072
(0.330) (0.322) (0.302)
Pressure Campaign × Business 0.857
(0.515)
Log(Mass Comments) -0.043 -0.118***
(0.030) (0.028)
Log(Mass Comments) × Public -0.068+
(0.038)
Log(Mass Comments) × Business 0.076
(0.059)
Mass Comments -0.540* -1.799*
(0.205) (0.794)
(Mass Comments)^2 0.056* 0.681
(0.024) (0.498)
Num.Obs. 252 211 252 211 252 211
R2 0.342 0.295 0.335 0.301 0.318 0.291
AIC 898.8 774.9 901.5 772.9 908.0 776.1
BIC 1011.7 875.5 1014.4 873.5 1021.0 876.7
Log.Lik. -417.398 -357.471 -418.728 -356.466 -422.024 -358.067
Std. Errors Clustered (agency) Clustered (agency) Clustered (agency) Clustered (agency) Clustered (agency) Clustered (agency)
FE: agency X X X X X X
+ p < 0.1, * p < 0.05, ** p < 0.01, *** p < 0.001
plot_quadratic(mc5)

Two-way interaction

# mc-success-president2

# coalition success with agency and president FE
mc1 <- feols(coalition_success ~ 
          campaign_*coalition_type + 
            coalition_type*president + 
          # campaign_*coalition_business_ +
          # log(comments + 1)*coalition_type
          # log(comments + 1)*coalition_business_ + 
          # comments * coalition_type + 
          # comments^2 * coalition_type +
          # comments^2 * coalition_business +
          coalition_ + log(coalition_size) + #  coalition_size^2 + 
          Coalition_Position + 
          # comment_length + 
          coalition_unopposed
          # Agency and president FE 
          | agency, #+ president, 
        data = coalitions_coded)

mc2 <- feols(coalition_success ~ 
          #campaign_*coalition_type + # m1
          campaign_*coalition_business_ +
            coalition_business_*president +# m2
          # log(comments + 1)*coalition_type # m3
          # log(comments + 1)*coalition_business_ + # m4
          # comments + comments^2 + coalition_type + #m5
          # comments + comments^2 + coalition_business_ + #m6
          coalition_ + log(coalition_size) + #  coalition_size^2 + 
          Coalition_Position + 
          # comment_length + 
          coalition_unopposed
          # Agency and president FE 
          | agency, #+ president, 
        data = coalitions_coded)

mc3 <- feols(coalition_success ~ 
          #campaign_*coalition_type + # m1
          # campaign_*coalition_business_ + # m2
          log(comments + 1)*coalition_type+ # m3
            coalition_type*president +
          # log(comments + 1)*coalition_business_ + # m4
          # comments + comments^2 + coalition_type + #m5
          # comments + comments^2 + coalition_business_ + #m6
          coalition_ + log(coalition_size) + #  coalition_size^2 + 
          Coalition_Position + 
          # comment_length + 
          coalition_unopposed
          # Agency and president FE 
          | agency,# + president, 
        data = coalitions_coded)

mc4 <- feols(coalition_success ~ 
          #campaign_*coalition_type + # m1
          #campaign_*coalition_business_ + # m2
          # log(comments + 1)*coalition_type + # m3
          log(comments + 1)*coalition_business_ + # m4
            coalition_business_*president+
          # comments + comments^2 + coalition_type + #m5
          # comments + comments^2 + coalition_business_ + #m6
          coalition_ + log(coalition_size) + #  coalition_size^2 + 
          Coalition_Position + 
          # comment_length + 
          coalition_unopposed
          # Agency and president FE 
          | agency,# + president, 
        data = coalitions_coded)

mc5 <- feols(coalition_success ~ 
          # campaign_*coalition_type + # m1
          # campaign_*coalition_business_ + # m2
          # log(comments + 1)*coalition_type + # m3
          # log(comments + 1)*coalition_business_ + # m4
          comments100k*coalition_type + coalition_type*comments100k^2 + #m5
            coalition_type*president +
          # comments + comments^2 + coalition_business_ + #m6
          coalition_ + log(coalition_size) + #  coalition_size^2 + 
          Coalition_Position + 
          # comment_length + 
          coalition_unopposed
          # Agency and president FE 
          | agency , 
        data = coalitions_coded)

mc6 <- feols(coalition_success ~ 
          #campaign_*coalition_type + # m1
          # campaign_*coalition_business_ + # m2
          # log(comments + 1)*coalition_type + # m3
          # log(comments + 1)*coalition_business_ + # m4
          # comments + comments^2 + coalition_type + #m5
          comments100k + comments100k^2 + coalition_business_+ #m6
            coalition_business_*president+
          coalition_ + log(coalition_size) + #  coalition_size^2 + 
          Coalition_Position + 
          # comment_length + 
          coalition_unopposed
          # Agency and president FE 
          | agency, 
        data = coalitions_coded)

models_president <- list(mc1, mc2, mc3, mc4, mc5, mc6)

# paper table fixest
modelsummary::modelsummary( models_president, 
                            stars = TRUE, 
                            #coef_map =
                            coef_rename =  cm,
                            gof_omit = "R2 .*",
                          add_rows = rowsFE, 
                          notes = "") %>% 
  row_spec(row = 1, bold = T) #%>% kable2(file = "mc-success")
Model 1 Model 2 Model 3 Model 4 Model 5 Model 6
Dependent Variable Lobbying Success Lobbying Success Lobbying Success Lobbying Success Lobbying Success Lobbying Success
Pressure Campaign 0.295 -1.029*
(0.333) (0.386)
Public 0.829+ 0.747 0.470
(0.439) (0.469) (0.419)
Bush -1.310* -1.159*** -1.283* -1.268*** -1.305* -1.093***
(0.476) (0.254) (0.516) (0.232) (0.544) (0.197)
Trump -0.047 -1.460** -0.066 -1.519** -0.050 -1.391**
(0.265) (0.429) (0.305) (0.432) (0.288) (0.453)
Coalition -0.019 -0.082 -0.033 -0.133 0.034 -0.186
(0.457) (0.480) (0.478) (0.483) (0.518) (0.558)
Log(Coalition Size) 0.213+ 0.268* 0.224+ 0.292** 0.131 0.269*
(0.106) (0.098) (0.121) (0.094) (0.124) (0.115)
Supports Rule 1.038** 0.997* 1.043** 0.986* 1.059** 0.968*
(0.328) (0.392) (0.337) (0.386) (0.342) (0.410)
Unopposed 0.946*** 1.197** 1.030*** 1.260*** 1.112*** 1.342***
(0.200) (0.326) (0.203) (0.323) (0.209) (0.311)
Pressure Campaign × Public -1.394**
(0.430)
Public × Bush 0.293 0.140 0.342
(0.674) (0.655) (0.656)
Public × Trump -1.133* -1.098* -1.004*
(0.449) (0.468) (0.454)
Business Coalition -1.012+ -1.137* -0.828+
(0.498) (0.512) (0.450)
Pressure Campaign × Business 1.142+
(0.559)
Business × Bush 0.612 0.825 0.498
(0.659) (0.694) (0.601)
Business × Trump 1.720** 1.820** 1.614*
(0.595) (0.590) (0.580)
Log(Mass Comments) -0.021 -0.139***
(0.037) (0.029)
Log(Mass Comments) × Public -0.087+
(0.045)
Log(Mass Comments) × Business 0.168+
(0.089)
Mass Comments 0.012 -1.923+
(0.513) (1.013)
(Mass Comments)^2 -0.008 0.674
(0.054) (0.579)
Mass Comments*Public -0.550
(0.538)
coalition_typePublic:I(comments100k^2) 0.067
(0.062)
Num.Obs. 252 211 252 211 252 211
R2 0.369 0.334 0.358 0.343 0.339 0.326
AIC 892.6 766.9 896.9 764.1 907.9 769.2
BIC 1012.6 874.1 1016.9 871.3 1035.0 876.5
Log.Lik. -412.277 -351.425 -414.434 -350.032 -417.952 -352.612
Std. Errors Clustered (agency) Clustered (agency) Clustered (agency) Clustered (agency) Clustered (agency) Clustered (agency)
FE: agency X X X X X X
+ p < 0.1, * p < 0.05, ** p < 0.01, *** p < 0.001
plot_quadratic(mc5)

Three-way interaction

# mc-success-president3

# coalition success with agency and president FE
mc1 <- feols(coalition_success ~ 
          campaign_*president*coalition_type + 
          # campaign_*coalition_business_ +
          # log(comments + 1)*coalition_type
          # log(comments + 1)*coalition_business_ + 
          # comments * coalition_type + 
          # comments^2 * coalition_type +
          # comments^2 * coalition_business +
          coalition_ + log(coalition_size) + #  coalition_size^2 + 
          Coalition_Position + 
          # comment_length + 
          coalition_unopposed
          # Agency and president FE 
          | agency, #+ president, 
        data = coalitions_coded)

mc2 <- feols(coalition_success ~ 
          #campaign_*coalition_type + # m1
          campaign_*coalition_business_*president + # m2
          # log(comments + 1)*coalition_type # m3
          # log(comments + 1)*coalition_business_ + # m4
          # comments + comments^2 + coalition_type + #m5
          # comments + comments^2 + coalition_business_ + #m6
          coalition_ + log(coalition_size) + #  coalition_size^2 + 
          Coalition_Position + 
          # comment_length + 
          coalition_unopposed
          # Agency and president FE 
          | agency, #+ president, 
        data = coalitions_coded)

mc3 <- feols(coalition_success ~ 
          #campaign_*coalition_type + # m1
          # campaign_*coalition_business_ + # m2
          log(comments + 1)*coalition_type*president + # m3
          # log(comments + 1)*coalition_business_ + # m4
          # comments + comments^2 + coalition_type + #m5
          # comments + comments^2 + coalition_business_ + #m6
          coalition_ + log(coalition_size) + #  coalition_size^2 + 
          Coalition_Position + 
          # comment_length + 
          coalition_unopposed
          # Agency and president FE 
          | agency,# + president, 
        data = coalitions_coded)

mc4 <- feols(coalition_success ~ 
          #campaign_*coalition_type + # m1
          #campaign_*coalition_business_ + # m2
          # log(comments + 1)*coalition_type + # m3
          log(comments + 1)*coalition_business_*president + # m4
          # comments + comments^2 + coalition_type + #m5
          # comments + comments^2 + coalition_business_ + #m6
          coalition_ + log(coalition_size) + #  coalition_size^2 + 
          Coalition_Position + 
          # comment_length + 
          coalition_unopposed
          # Agency and president FE 
          | agency,# + president, 
        data = coalitions_coded)

mc5 <- feols(coalition_success ~ 
          # campaign_*coalition_type + # m1
          # campaign_*coalition_business_ + # m2
          # log(comments + 1)*coalition_type + # m3
          # log(comments + 1)*coalition_business_ + # m4
          comments100k*coalition_type*president + coalition_type*president*comments100k^2 + coalition_type*president + #m5
          # comments + comments^2 + coalition_business_ + #m6
          coalition_ + log(coalition_size) + #  coalition_size^2 + 
          Coalition_Position + 
          # comment_length + 
          coalition_unopposed
          # Agency and president FE 
          | agency , 
        data = coalitions_coded)

mc6 <- feols(coalition_success ~ 
          #campaign_*coalition_type + # m1
          # campaign_*coalition_business_ + # m2
          # log(comments + 1)*coalition_type + # m3
          # log(comments + 1)*coalition_business_ + # m4
          # comments + comments^2 + coalition_type + #m5
          comments100k + comments100k^2 + coalition_business_*president + #m6
          coalition_ + log(coalition_size) + #  coalition_size^2 + 
          Coalition_Position + 
          # comment_length + 
          coalition_unopposed
          # Agency and president FE 
          | agency, 
        data = coalitions_coded)

models_president <- list(mc1, mc2, mc3, mc4, mc5, mc6)


# paper table fixest
modelsummary::modelsummary( models_president, 
                            stars = TRUE, 
                            #coef_map =
                            coef_rename =  cm,
                            gof_omit = "R2 .*",
                          add_rows = rowsFE, #FIXME rename rowsFE lobbying success
                          notes = "") %>% 
  row_spec(row = 1, bold = T) #%>% kable2(file = "mc-success")
Model 1 Model 2 Model 3 Model 4 Model 5 Model 6
Dependent Variable Lobbying Success Lobbying Success Lobbying Success Lobbying Success Lobbying Success Lobbying Success
Pressure Campaign 0.043 -1.520*
(0.604) (0.548)
Bush -1.385** -1.415** -1.321* -1.446*** -1.453* -1.093***
(0.402) (0.411) (0.559) (0.335) (0.609) (0.197)
Trump -0.148 -1.661** -0.145 -1.709** -0.102 -1.391**
(0.363) (0.500) (0.336) (0.528) (0.330) (0.453)
Public 0.873+ 0.896+ 0.600
(0.494) (0.514) (0.480)
Coalition -0.016 0.009 -0.004 -0.061 0.006 -0.186
(0.469) (0.450) (0.452) (0.496) (0.534) (0.558)
Log(Coalition Size) 0.206+ 0.236* 0.213+ 0.277* 0.144 0.269*
(0.114) (0.102) (0.117) (0.099) (0.148) (0.115)
Supports Rule 1.080** 1.028* 1.104** 1.005* 1.023* 0.968*
(0.324) (0.385) (0.331) (0.393) (0.372) (0.410)
Unopposed 0.840** 1.240** 0.895*** 1.229** 1.034*** 1.342***
(0.289) (0.360) (0.221) (0.362) (0.229) (0.311)
Pressure Campaign × Bush 0.561 1.143
(0.988) (0.964)
Pressure Campaign × Trump 0.324 0.966
(0.800) (0.759)
Pressure Campaign × Public -1.410*
(0.604)
Bush × Public 0.208
(0.650)
Trump × Public -1.219*
(0.558)
Campaign × Public × Bush -0.046
(0.984)
Campaign × Public × Trump 0.222
(0.855)
Business Coalition -1.210* -1.239* -0.828+
(0.574) (0.575) (0.450)
Pressure Campaign × Business 2.309**
(0.776)
Business × Bush 0.927 0.986 0.498
(0.809) (0.793) (0.601)
Business × Trump 1.990** 1.981** 1.614*
(0.680) (0.673) (0.580)
campaign_TRUE:coalition_business_TRUE:presidentBush -2.343*
(1.117)
campaign_TRUE:coalition_business_TRUE:presidentTrump -2.112+
(1.032)
Log(Mass Comments) -0.028 -0.174***
(0.042) (0.043)
Log(Mass Comments) × Public -0.131*
(0.055)
Log(Mass Comments) × Bush 0.137 0.087+
(0.120) (0.047)
Log(Mass Comments) × Trump 0.006 0.093
(0.084) (0.062)
Public × Bush 0.031 0.381
(0.716) (0.726)
Public × Trump -1.359* -1.153*
(0.546) (0.510)
Log(Mass Comments) × Public × Bush -0.109
(0.134)
Log(Mass Comments) × Public × Trump 0.097
(0.092)
Log(Mass Comments) × Business 0.208+
(0.111)
Log(Mass Comments) × Business × Bush -0.822*
(0.315)
Log(Mass Comments) × Business × Trump -0.057
(0.452)
Mass Comments -0.048 -1.923+
(0.608) (1.013)
(Mass Comments)^2 -0.002 0.674
(0.065) (0.579)
Mass Comments*Public -2.039*
(0.829)
comments100k:presidentBush 3723.251
(2314.743)
comments100k:presidentTrump 931.153
(5151.613)
coalition_typePublic:I(comments100k^2) 0.581**
(0.201)
presidentBush:I(comments100k^2) 112.954*
(54.117)
presidentTrump:I(comments100k^2) -18802.161
(104006.494)
comments100k:coalition_typePublic:presidentBush -3894.627
(2286.960)
comments100k:coalition_typePublic:presidentTrump -929.385
(5151.591)
coalition_typePublic:presidentTrump:I(comments100k^2) 18801.612
(104006.460)
Num.Obs. 252 211 252 211 252 211
R2 0.372 0.343 0.366 0.347 0.350 0.326
AIC 899.3 772.0 901.6 770.6 917.8 769.2
BIC 1033.4 892.7 1035.7 891.3 1069.6 876.5
Log.Lik. -411.630 -350.001 -412.813 -349.296 -415.899 -352.612
Std. Errors Clustered (agency) Clustered (agency) Clustered (agency) Clustered (agency) Clustered (agency) Clustered (agency)
FE: agency X X X X X X
+ p < 0.1, * p < 0.05, ** p < 0.01, *** p < 0.001
plot_quadratic(mc5)

Mixed effects / hierarchical models

Coalition-level Hierarchical Models

Random intercept models

With random effects for agency and president, results look very similar to the fixed-effects models.

#mcme
mc_data <- coalitions_coded

# mixed model with random intercepts for president and agency
mcme1 = lmer(coalition_success ~ 
               campaign_*coalition_type +
              Coalition_Position + 
              log(coalition_size) + 
              (1|agency) + (1|president), # random intercept for each agency and president 
               data = mc_data)

# with business indicator
mcme2 = lmer(coalition_success ~ campaign_*coalition_business_ +
              Coalition_Position + 
              log(coalition_size) + 
              (1|agency) +
               (1|president),
               data = mc_data)

# with log 
mcme3 = lmer(coalition_success ~ log(comments + 1)*coalition_type +
              Coalition_Position + 
              log(coalition_size) + 
              (1|agency) + (1|president), 
               data = mc_data)

mcme4 = lmer(coalition_success ~ 
               log(comments + 1)*coalition_business_ +
              Coalition_Position + 
              log(coalition_size) + 
              (1|agency) + (1|president), 
               data = mc_data)

# with quadratic
mcme5 = lmer(coalition_success ~ 
               comments100k*coalition_type +
               comments100k^2*coalition_type + 
              Coalition_Position + 
              log(coalition_size) + 
              (1|agency) + (1|president), 
               data = mc_data)

mcme6 = lmer(coalition_success ~
               comments100k*coalition_business_ +
               comments100k^2*coalition_business_ + 
               Coalition_Position + 
              log(coalition_size) + 
              (1|agency) + (1|president), 
               data = mc_data)



# coef plot 
# broom.mixed::tidy(mcme1) %>% 
#   mutate(term = ifelse(str_detect(term, "sd__.Int"), paste(group, term), term)) %>%  
#   dwplot + geom_vline(xintercept=0,lty=2)

# models table 
models_mcme <- list(mcme1, mcme2, mcme3, mcme4, mcme5, mcme6)

# paper table random intercepts 
modelsummary::modelsummary( models_mcme, 
                            stars = TRUE, 
                            coef_rename =  cm,
                            coef_omit = "sd__.Int",
                            gof_omit = "R2 .*",
                          add_rows = mc_rows6, 
                          notes = "") %>% 
  row_spec(row = 1, bold = T) #%>% kable2(file = "mc-success")
Model 1 Model 2 Model 3 Model 4 Model 5 Model 6
Dependent Variable Lobbying Success Lobbying Success Lobbying Success Lobbying Success Lobbying Success Lobbying Success
(Intercept) -1.033* -0.937* -0.995* -0.928* -0.882* -0.964*
(0.333) (0.314) (0.338) (0.325) (0.320) (0.310)
Pressure Campaign 0.326 -0.768+
(0.466) (0.411)
Public 0.224 0.153 -0.014
(0.210) (0.210) (0.196)
Supports Rule 1.142*** 1.029*** 1.113*** 1.015*** 1.128*** 1.018***
(0.187) (0.215) (0.188) (0.214) (0.192) (0.216)
Log(Coalition Size) 0.172* 0.192* 0.201** 0.207* 0.113+ 0.168*
(0.074) (0.089) (0.074) (0.090) (0.062) (0.084)
Pressure Campaign × Public -1.238*
(0.499)
sd__Observation 1.350 1.423 1.359 1.417 1.380 1.429
Business Coalition 0.058 0.052 0.127
(0.224) (0.225) (0.218)
Pressure Campaign × Business 0.661
(0.863)
Log(Mass Comments) -0.037 -0.104*
(0.073) (0.047)
Log(Mass Comments) × Public -0.066
(0.073)
Log(Mass Comments) × Business 0.062
(0.130)
Mass Comments -0.051 -0.811
(0.171) (0.536)
Mass Comments*Public -0.111
(0.202)
Mass Comments*Business -0.023
(1.777)
AIC 911.2 783.8 920.3 790.4 923.2 782.8
BIC 943.0 813.9 952.1 820.6 955.0 812.9
Log.Lik. -446.594 -382.888 -451.156 -386.204 -452.612 -382.380
REMLcrit 893.189 765.776 902.312 772.409 905.223 764.760
+ p < 0.1, * p < 0.05, ** p < 0.01, *** p < 0.001
# plot_quadratic(mcme5)

Random effects

I now allow the effect of campaigns to vary across agencies and presidents.

TODO

#mcme-hierarchical 

# mixed model with random slopes for campaign by president and agency 
mcme1 = lmer(coalition_success ~ 
               campaign_ +
               #TODO # random intercept for each agency and president 
               data = mc_data)

# mixed model with random effects for president and agency
mcme1 = lmer(coalition_success ~ campaign_*coalition_type +
              Coalition_Position + 
              log(coalition_size) + 
               (1|agency) +
               #FIXME make effect of campaign vary by agency and president? 
              #(campaign_|agency) + 
               (1|president), # random intercept for each coalition
               data = mc_data)

mcme2 = lmer(coalition_success ~ campaign_*coalition_business_ +
              Coalition_Position + 
              log(coalition_size) + 
              (1|agency) + (1|president), # random intercept for each coalition
               data = mc_data)

mcme3 = lmer(coalition_success ~ log(comments + 1)*coalition_type +
              Coalition_Position + 
              log(coalition_size) + 
              (1|agency) + (1|president), # random intercept for each coalition
               data = mc_data)

mcme4 = lmer(coalition_success ~ log(comments + 1)*coalition_business_ +
              Coalition_Position + 
              log(coalition_size) + 
              (1|agency) + (1|president), # random intercept for each coalition
               data = mc_data)

mcme5 = lmer(coalition_success ~ comments100k*coalition_type +  comments100k^2*coalition_type + 
              Coalition_Position + 
              log(coalition_size) + 
              (1|agency) + (1|president), # random intercept for each coalition
               data = mc_data)

mcme6 = lmer(coalition_success ~ comments100k*coalition_business_ +  comments100k^2*coalition_business_ + 
              Coalition_Position + 
              log(coalition_size) + 
              (1|agency) + (1|president), # random intercept for each coalition
               data = mc_data)



# coef plot 
# broom.mixed::tidy(mcme1) %>% 
#   mutate(term = ifelse(str_detect(term, "sd__.Int"), paste(group, term), term)) %>%  
#   dwplot + geom_vline(xintercept=0,lty=2)

# Table 
models_mcme <- list(mcme1, mcme2, mcme3, mcme4, mcme5, mcme6)

# paper table random effects
modelsummary::modelsummary( models_mcme, 
                            stars = TRUE, 
                            coef_rename =  cm,
                            coef_omit = "sd__.Int",
                            gof_omit = "R2 .*",
                          add_rows = mc_rows6, 
                          notes = "") %>% 
  row_spec(row = 1, bold = T) #%>% kable2(file = "mc-success")

# plot_quadratic(mcme5)

Organization-level Hierarchical Models

Because organizations are nested in coalitions, I estimate a hierarchical model grouping by coalition.

#mome
#FIXME us this in all org-level models
comments_coded %<>% mutate(comments100k = coalition_comments/100000)


mo_data <- comments_coded %>% 
  drop_na(coalition_type, Position) %>% 
  filter(comment_type == "Org") %>% 
  distinct(org_name, docket_id, success, coalition_type, coalition_size, Position, comments100k, president, campaign_, coalition, agency) %>% filter(president != "Bush")  %>% droplevels()


# mixed model with random slopes for campaign by president and agency 
mcme1 = lme(success ~ 
               campaign_,
               random = ~campaign_|agency,
            na.action = "na.omit", 
               data = mo_data)

# mixed model with random effects for coalition
mome1 = lmer(success ~ campaign_*coalition_type+
              Position + 
              log(coalition_size) + 
              (1|coalition) + (1|agency) + 
               (1|president), # random intercept for each coalition
               data = mo_data)

mome2 = lmer(success ~ comments100k*coalition_type +
               coalition_type*(comments100k^2) +
              Position + 
              log(coalition_size) + 
              (1|coalition) + (1|agency) + 
               (1|president), # random intercept for each coalition
               data = mo_data)

mome3 = lmer(success ~ comments100k*coalition_type*president +
              coalition_type*president*comments100k^2 +
              Position + 
              log(coalition_size) + 
              (1|coalition) + (1|agency), # random intercept for each coalition
               data = mo_data)

models_mome <- list(mome1, mome2, mome3)

# paper table random effects
modelsummary::modelsummary( models_mome, 
                            stars = TRUE, 
                            coef_rename =  cm,
                            coef_omit = "sd__.Int",
                            gof_omit = "R2 .*",
                          add_rows = success_rows3, 
                          notes = "") %>% 
  row_spec(row = 1, bold = T) #%>% kable2(file = "mc-success")
Model 1 Model 2 Model 3
Dependent Variable Lobbying Success Lobbying Success Lobbying Success
(Intercept) 0.132 0.193 0.133
(0.451) (0.460) (0.388)
Pressure Campaign -0.149
(0.381)
Public -0.125 -0.225 0.525
(0.254) (0.247) (0.347)
Supports Rule 0.268** 0.258** 0.212*
(0.093) (0.093) (0.094)
Log(Coalition Size) 0.021 -0.011 -0.002
(0.074) (0.064) (0.065)
Pressure Campaign × Public -0.238
(0.459)
sd__Observation 1.231 1.230 1.229
Mass Comments -0.107 -0.081
(0.173) (0.170)
Mass Comments*Public 0.149 -0.085
(0.181) (0.354)
Trump -0.062
(0.325)
comments100k:presidentTrump -7.048
(28.667)
Public × Trump -1.403**
(0.441)
comments100k:coalition_typePublic:presidentTrump 7.244
(28.678)
AIC 10361.6 10367.1 10353.0
BIC 10421.8 10427.4 10431.3
Log.Lik. -5170.783 -5173.569 -5163.480
REMLcrit 10341.566 10347.138 10326.959
+ p < 0.1, * p < 0.05, ** p < 0.01, *** p < 0.001
# coef plot
# broom.mixed::tidy(mome1) %>% 
#   mutate(term = ifelse(str_detect(term, "sd__.Int"), paste(group, term), term)) %>%  
#   dwplot + geom_vline(xintercept=0,lty=2)
# tidy(mcme1, conf.int = T)

# tidy(mcme1,effects="fixed")

#fixef(mcme1) #is the canonical way to extract coefficients from mixed models 

# you can get the full coefficient table with coef(summary(m)); if you have loaded lmerTest before fitting the model, or convert the model after fitting (and then loading lmerTest) via coef(summary(as(m,"merModLmerTest"))), then the coefficient table will include p-values. (The coefficient table is a matrix; you can extract the columns via e.g. ctab[,"Estimate"], ctab[,"Pr(>|t|)"], or convert the matrix to a data frame and use $-indexing.)

# get likelihood profile confidence intervals via 
#confint(mcme1) 
#; these may be computationally intensive. If you use confint(m, method="Wald") you'll get the standard +/- 1.96SE confidence intervals. (lme uses intervals(m) instead of confint().)

#broom.mixed::tidy(mcme1,effects="fixed")
# gives you a table with estimates, standard errors, etc.
# tidy(as(m,"merModLmerTest"), effects="fixed") (or fitting with lmerTest in the first place) includes p-values
# adding conf.int=TRUE gives (Wald) CIs
# adding conf.method="profile" (along with conf.int=TRUE) gives likelihood profile CIs
# You can also get confidence intervals by parametric bootstrap (method="boot"), which is considerably slower but more accurate in some circumstances.

# A data frame of values at which to estimate probabilities:

values <- mo_data %>% 
  tidyr::expand(comments100k = seq(1, 10, by = .1) %>% as.numeric(),
                #org_name = c("Sierra Club"),
                campaign_ = campaign_,
                coalition_type = coalition_type,
                coalition_size = 100 %>% as.integer(),
                agency = "BSEE" ,
                Position = Position,
                #docket_id = docket_id,
                coalition = c("Sierra Club", "Axcess Financial", "Aclu", "American Petroleum Institute"),
                president = president) %>%
  filter( (coalition %in% c("Axcess Financial", "American Petroleum Institute") & coalition_type == "Private") | (!coalition %in% c("Axcess Financial", "American Petroleum Institute") & coalition_type == "Public"))

# names(mo_data) %in% names(values)
# 
# tibble(class = map(values, class) %>% unlist(),
#        name = names(values) ) %>% 
#   full_join(
#     tibble(class = map(mo_data, class) %>% unlist(),
#            name = names(mo_data)))

broom.mixed::augment(mome1, 
                     type.predict = "response",
                      newdata = values,
                     se_fit = TRUE) %>% #names()
  distinct(coalition, coalition_type, campaign_, .fitted, Position, president) %>%
  #filter(`log(coalition_size)`==0) %>% 
  ggplot() + 
  aes(x = campaign_, y = .fitted, color =coalition_type,
      shape = coalition) +
  geom_point() +
  #geom_text(check_overlap = T) + 
        facet_grid(Position ~ president)+
  labs(x = "Mass comment campaign",
       shape = "Coalition",
       y = "Predicted Lobbying Success",
       color = "Coalition Type", 
       linetype = "Agency") 


broom.mixed::augment(mome2, 
                     type.predict = "response",
                      newdata = values,
                     se_fit = TRUE) %>% #names()
  distinct(coalition, coalition_type, comments100k, .fitted, Position, president) %>%
  #filter(`log(coalition_size)`==0) %>% 
  ggplot() + 
  aes(x = comments100k*100, 
      y = .fitted, 
      color =coalition_type,
      linetype = coalition) +
  #geom_point() +
  geom_line() +
        facet_grid(Position ~ president)+
  labs(x = "Mass comments (Thousands)",
       y = "Predicted Lobbying Success",
       color = "Coalition Type", 
       linetype = "Coalition")

Balla, Steven J., Alexander R. Beck, Elizabeth Meehan, and Aryamala Prasad. 2020. “Lost in the Flood?: Agency Responsiveness to Mass Comment Campaigns in Administrative Rulemaking.” Regulation & Governance.
Dwidar, Maraam. 2021. “Diverse Lobbying Coalitions and Influence in Notice-and-Comment Rulemaking.” Policy Studies Journal. https://doi.org/10.1111/psj.12431.
Nelson, David, and Susan Webb Yackee. 2012. Lobbying Coalitions and Government Policy Change: An Analysis of Federal Agency.” The Journal of Politics 74 (2): 339–53. https://doi.org/10.1017/s0022381611001599.
Yackee, Jason Webb, and Susan Webb Yackee. 2006. A Bias Towards Business? Assessing Interest Group Influence on the U.S. Bureaucracy.” Journal of Politics 68 (1): 128–39. https://doi.org/10.1111/j.1468-2508.2006.00375.x.

  1. Through an iterative process described in ??, I developed software and methods to select comments that were most likely submitted by organizations rather than by individuals. For example, I include all comments submitted as file attachments rather than typed into the textbox.↩︎

  2. NRDC’s three policy demands were: (1) “The Rule Should Categorically Protect Certain “Other Waters” including Vernal Pools, Pocosins, Sinkhole Wetlands, Rainwater Basin Wetlands, Sand Hills Wetlands, Playa Lakes, Interdunal Wetlands, Carolina and Delmarva bays, and Other Coastal Plain Depressional Wetlands, and Prairie Potholes. Furthermore, “Other ‘Isolated’ Waters Substantially Affect Interstate Commerce and Should be Categorically Protected Under the Agencies’ Commerce Clause Authority.” (2) “The Rule Should Not Exempt Ditches Without a Scientific Basis” (3) “The Rule Should Limit the Current Exemption for Waste Treatment Systems”↩︎